一、WebClient调取
这个方法网上也有一些例子,我是参考Stack Overflow上的一篇文章做的,demo代码如下,想用的话照这个改造下就行了。
public async static Task<string> CallWebService(string webWebServiceUrl)
{
string soapText =
@"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" >
<soap:Body>
<方法名 xmlns=""替换namespace"">
<参数1>参数值</参数1>
<参数2>参数值</参数2>
</方法名>
</soap:Body>
</soap:Envelope>";
using (WebClient webClient = new WebClient())
{
try
{
webClient.Proxy = null;
byte[] postDatabyte = Encoding.GetEncoding("UTF-8").GetBytes(soapText);
webClient.Headers.Add("Content-Type", "text/xml");
byte[] responseData = webClient.UploadData(webWebServiceUrl, "POST", postDatabyte);
//解码
string responsestring = Encoding.GetEncoding("UTF-8").GetString(responseData);
return responsestring;
}
catch (Exception e)
{
return null;
}
}
}
}
二、利用微软提供的工具Svcutil.exe 官方链接
2.1 编辑.csproj 文件
在文件中追加节点,然后在项目跟目录下shift+右键,打开powershell,执行 dotnet restore(或者重新生成)
<ItemGroup>
<DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*" />
</ItemGroup>
2.2 生成代理类
继续执行 dotnet svcutil http://替换地址?wsdl,我在执行该命令的时候报错了,报了一个关于binding巴拉巴拉此处省略记不得了的一个错误,但是最后代理类生成成功了(项目路径下生成一个ServiceReference1文件夹,里边有一个Reference.cs 文件),后期测试正常可以用,此处就不深究啦。
2.3 再次执行 dotnet restore(或者重新生成)
2.4 打开项目测试
首先去看了Reference.cs,就是一个interface接口,然后调用测试,以为万事大吉了呢,谁知一运行就咔咔的报错了,One or more errors occurred. (The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.)
// 创建 HTTP 绑定对象
var binding = new BasicHttpBinding();
// 如果是https则添加
//binding.Security.Mode = BasicHttpSecurityMode.Transport;
// 根据 WebService 的 URL
var endpoint = new EndpointAddress("替换地址");
// 创建调用接口的工厂,注意这里泛型只能传入接口
var factory = new ChannelFactory<生成的接口>(binding, endpoint);
// 从工厂获取具体的调用实例
var callClient = factory.CreateChannel();
// 调用具体的方法,这个地方就看你都有啥方法啦,自行替换
string result = callClient.测试方法().Result;
拿着这个错误去搜了好久呀,找到一个微软关于这个问题的文章文章链接,但是这篇文章写的有点坑,路径和配置文件都说的不清不楚的,然后我从参考了文章链接,工具路径C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools,造了一个svcutil.exe.config,然而,这并没有拯救我,QAQ,随后我是从这篇文章中得到的启示,其实问题已经很明确了,就是现在找不到配置的地方,实现其实很简单, binding.MaxReceivedMessageSize = 2147483647;就行了.代码如下,问题顺利解决。
// 创建 HTTP 绑定对象
var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = 2147483647;
// 根据 WebService 的 URL
var endpoint = new EndpointAddress("替换地址");
// 创建调用接口的工厂,注意这里泛型只能传入接口
var factory = new ChannelFactory<生成的接口>(binding, endpoint);
// 从工厂获取具体的调用实例
var callClient = factory.CreateChannel();
// 调用具体的方法,这个地方就看你都有啥方法啦,自行替换
string result = callClient.测试方法().Result;