【转】C# 调用WebService的方法
很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理。更多的内容可以看下面的两个地址:
http://blog.csdn.net/limlimlim/article/details/8651043 http://www.cnblogs.com/VisualStudio/archive/2008/10/29/1322228.html .动态调用的url后面注意一定要加上?WSDL
例如:string _url = "http://服务器IP:端口/CITI_TRANS_WH/wsTransData_InWH.asmx?WSDL"; ---------------------------------------------------------------------------------------------------
.WebService中传递List泛型对象
[WebMethod]
public List<TestModel> TestTransDataByClass(int _max) 注意TestModel必须是可以序列化的类 //必须可序列化
[Serializable]
public class TestModel
{
public int No
{
get;
set;
}
public string Des
{
get;
set;
}
}
---------------------------------------------------------------------------------------------------
.WebService中不能直接传递输出dictionary<string,object>这样的泛型对象,必须自定义一个类来输出,这个类同样也是可以序列化的
[Serializable]
public class MyDictionary
{
public List<TestModel> Table1
{
get;
set;
} public List<TestModel2> Table2
{
get;
set;
}
}
---------------------------------------------------------------------------------------------------
.动态调用WebService的类封装
public static class InvokeWebServiceDynamic
{
/// <summary>
/// 动态调用WebService
/// </summary>
/// <param name="_url">web服务url地址</param>
/// <param name="_methodName">web服务中的方法</param>
/// <param name="_params">传递给方法的参数</param>
/// <returns></returns>
public static object InvokeWebMethod(string _url ,string _methodName,
params object[] _params)
{
WebClient client = new WebClient();
//String url = "http://localhost:3182/Service1.asmx?WSDL";//这个地址可以写在Config文件里面
Stream stream = client.OpenRead(_url);
ServiceDescription description = ServiceDescription.Read(stream); ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。
importer.ProtocolName = "Soap"; //指定访问协议。
importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties |
CodeGenerationOptions.GenerateNewAsync;
importer.AddServiceDescription(description, null, null); //添加WSDL文档。
CodeNamespace nmspace = new CodeNamespace(); //命名空间
nmspace.Name = "TestWebService"; //这个命名空间可以自己取
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace);
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.OutputAssembly = "MyTest.dll";//输出程序集的名称
parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");
CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
if (result.Errors.HasErrors)
{
// 显示编译错误信息
}
Assembly asm = Assembly.LoadFrom("MyTest.dll");//加载前面生成的程序集
Type t = asm.GetType("TestWebService.wsTransData_InWH"); //前面的命名空间.类名,类必须是webservice中定义的
object o = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(_methodName);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
object item = method.Invoke(o, _params); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了
//foreach (string str in item)
// Console.WriteLine(str); //上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面
//TextWriter writer = File.CreateText("MyTest.cs");
//provider.GenerateCodeFromCompileUnit(unit, writer, null);
//writer.Flush();
//writer.Close();
return item;
}
}
---------------------------------------------------------------------------------------------------
.通过反射提取web方法返回的自定义类数据
说明:
<>.WebService方法TestTransDataByDic返回自定义的MyDictionary对象
<>.它包含两个属性table1,table2
<>.类定义代码如下
[Serializable]
public class MyDictionary
{
public List<TestModel> Table1
{
get;
set;
} public List<TestModel2> Table2
{
get;
set;
}
} <>.客户端调用代码 private void InvokeDic_Click(object sender, EventArgs e)
{
//要注意加?WSDL
//string _url = "http://localhost:58764/wsTransData_InWH.asmx?WSDL";
int _count = int.Parse(txtCount.Text);
object o = InvokeWebServiceDynamic.InvokeWebMethod(_url, "TestTransDataByDic",
new object[] { _count });
PropertyInfo _propertyTable1 = o.GetType().GetProperty("Table1");
PropertyInfo _propertyTable2 = o.GetType().GetProperty("Table2"); //读取Table1属性中的数据
object[] _table1Items = (object[])_propertyTable1.GetValue(o, null);
if(_table1Items.Length>)
{
lstData1.Visible = false;
lstData1.Items.Clear();
//反射出对象TestModel的属性
PropertyInfo _propertyNo = _table1Items[].GetType().GetProperty("No");
PropertyInfo _propertyDes = _table1Items[].GetType().GetProperty("Des");
for (int i = ; i < _table1Items.Length; i++)
{
//根据属性取值
string _no = _propertyNo.GetValue(_table1Items[i], null).ToString();
string _des = _propertyDes.GetValue(_table1Items[i], null).ToString();
string _format = string.Format("第{0}条:{1}", _no, _des);
lstData1.Items.Add(_format);
} lstData1.Visible = true;
} //读取Table2属性中的数据
object[] _table2Items = (object[])_propertyTable2.GetValue(o, null);
if (_table2Items.Length > )
{
lstData2.Visible = false;
lstData2.Items.Clear();
//反射出对象TestModel2的属性
PropertyInfo _propertyMyFNo = _table2Items[].GetType().GetProperty("MyFNo");
PropertyInfo _propertyMyFDes = _table2Items[].GetType().GetProperty("MyFDes"); for (int i = ; i < _table1Items.Length; i++)
{
//根据属性取值
string _no = _propertyMyFNo.GetValue(_table2Items[i], null).ToString();
string _des = _propertyMyFDes.GetValue(_table2Items[i], null).ToString();
string _format = string.Format("第{0}条:{1}", _no, _des);
lstData2.Items.Add(_format);
} lstData2.Visible = true;
}
MessageBox.Show("OK");
} ---------------------------------------------------------------------------------------------------
.客户端传递序列化对象给webserice方法 /// <summary>
///
/// </summary>
/// <param name="_dicGet">是一个客户端传过来的序列化的对象</param>
/// <returns></returns>
[WebMethod]
public string TestInsertData(byte[] _dicGet)
{
//反序列化对象
object _dicGetOK = SqlHelper.DeserializeObject(_dicGet);
return "ok";
} 注意: <>.创建一个.NET类库,把要传输的对象做成一个结构或类放在类库(假设为ClassLib.dll)中。如: <>.然后在客户端程序和webservice项目中都引用ClassLib.dll <>.上面两步的目的是让客户端序列化的对象,在webservice服务端能正常反序列化,不会出现反序列化时找不到命名空间的问题 ---------------------------------------------------------------------------------------------------
.修改webserivce最大传输的长度 <?xml version="1.0" encoding="utf-8"?> <!--
有关如何配置 ASP.NET 应用程序的详细消息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<connectionStrings>
<add name="ConStr" connectionString="$(ReplacableToken_ConStr-Web.config Connection String_0)"/>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="" />
</system.web> </configuration> .修改webservice的超时时间 <?xml version="1.0" encoding="utf-8"?> <!--
有关如何配置 ASP.NET 应用程序的详细消息,请访问
executionTimeout="" 超时时间120秒
maxRequestLength="" 最大请求长度
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<connectionStrings>
<add name="ConStr" connectionString="Data Source=192.128.58.248;Initial catalog=Citibank_test;Uid=sa;pwd=kicpassword"/>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="" executionTimeout="" />
</system.web> </configuration> .序列化,反序列化方法 public static byte[] SerializeObject(object pObj)
{
if (pObj == null)
return null;
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, pObj);
memoryStream.Position = ;
byte[] read = new byte[memoryStream.Length];
memoryStream.Read(read, , read.Length);
memoryStream.Close();
return read;
} public static object DeserializeObject(byte[] pBytes)
{
object newOjb = null;
if (pBytes == null)
{
return newOjb;
} System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(pBytes);
memoryStream.Position = ;
BinaryFormatter formatter = new BinaryFormatter();
newOjb = formatter.Deserialize(memoryStream);
memoryStream.Close(); return newOjb;
}
原文地址:http://www.cnblogs.com/zuiyirenjian/p/3536117.html
【转】C# 调用WebService的方法的更多相关文章
- 原生java调用webservice的方法,不用生成客户端代码
原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- C# 通过Get、Post、Soap调用WebService的方法
实现代码来源于网络,我只是作了一些修改! using System; using System.Web; using System.Xml; using System.Collections; usi ...
- 调用webservice客户端方法 runtime modeler error: Wrapper class ××× is not found. Have you run APT to generate them?
用wsimport生成webservice的客户端以后,调用客户端生成方法时总是出现 runtime modeler error: Wrapper class stardand.nrcms.nckin ...
- C# 调用WebService的方法
很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理.更多的内容可以看下面的两 ...
- Java调用webservice接口方法(SOAP message、xfire、axis)
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...
- 【后端C#】后台通过http post 调用 webservice 的方法
定义http post 调用webservice的某个方法 /// <summary> /// http Post调用 WebService /// </summary> pu ...
- 动态调用WebService 通用方法Moss 中 传统开发中都可用。
WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...
- 关于使用axis调用webservice接口方法
1.概述: 我们有时候会调用webserviec接口,我们向接口发送请求参数,从接口接收返回值. 2.形式: package client; import org.apache.axis.client ...
随机推荐
- js数组基本知识
1.数组的引出 用数组解决王大爷养乌龟的问题: var weights=[3,5,1,3.4,2,50]; var all_weight=0; var avg_weight=0; for (i=0;i ...
- 图像的线性空间滤波matlab实现
1.线性空间滤波函数Z = imfilter(X,H,option1,option2,...) X为输入图像矩阵,H为m*n维的掩膜矩阵,H中的数据类型必须是double类型.掩膜矩阵可以是用户定义, ...
- java读取url中json文件中的json数据
有时候需要远程从其他接口中获取json数据,如果遇到返回的json数据是一个文件而不直接是数据,那么可以通过以下方法进行读取: /** * 从数据接口获取到数据 * @return * @throws ...
- laravel 如何引入自己的函数或类库
例如在app下建一个Common文件夹 在Common下建一个function.php 放入公共函数 例如: function test(){ echo 'this is a test'; } 在项目 ...
- CentOS配置本地yum源/阿里云yum源/163yuan源,并配置yum源的优先级
一.用Centos镜像搭建本地yum源 由于安装centos后的默认yum源为centos的官方地址,所以在国内使用很慢甚至无法访问,所以一般的做法都是把默认的yum源替换成aliyun的yum源或者 ...
- unity5, Configurable Joint: Anchor, Connected Anchor, Auto Configure Connected Anchor
configurable joint加在轮子上,connected body是车身. 这种情况下,Anchor=(0,0,0)表示轮子一端joint锚点取carWheelCenter Connecte ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 批处理学习笔记1 - Hellow World
记录自己学习批处理的一点总结吧. 批处理的好处: 可以配合vs,在build完文件之后执行自己的批处理命令. 可以批量修改文件名,或者进行复杂的查询等,对文件可编程操作. 从Hellow world开 ...
- [MySQL] MySQL中关于外键报错的解决和建议
一.缘由 今天在恢复从库和主库不同步的数据时,看到关于外键的报错. ERROR 1451 (23000): Connot delete or update a parent row: a foreig ...
- ubuntu root权限
ubuntu-kylin@ubuntu-kylin:~$ sudo passwd root 输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:已成功更新密码 ubuntu-ky ...