以往我们要呼叫 ASMX Web Service 的服务,大多透过 Visual Studio 的「加入 -> 服务参考
」的程序,自动产生 Reference.cs
程式码档案,里面就有我们要用的服务代理。但现在因为开发环境无法连线 Web Service,所以无法使用这个方式,我们手上有的是一个 *.wsdl
档案,目前要改用手动的方式建立服务代理。
安装 dotnet-svcutil
执行下列指令,安装 dotnet-svcutil。
dotnet tool install --global dotnet-svcutil
产生 Reference.cs 档案
使用 dotnet-svcutil 产生 Reference.cs 档案,也就是我们要的服务代理。
dotnet-svcutil .\WebService1.wsdl --namespace "*,WebServiceClientLab.MyWebService" --outputDir "MyWebService" --sync
指令使用到的参数说明如下:
- --namespace:用来指定 WSDL 或 XML 里面的 targetNamespace(目标命名空间)要对应到 .NET 的命名空间。你可以指定一个或多个对应关係,如果有些 targetNamespace 没有特别指定对应,请用 '*' 表示通用的对应规则。如果不特别设定,它会自动根据 WSDL 里的 targetNamespace 来产生对应的 .NET 命名空间。简单来说,就是让你控制产生出来的 C# 类别,放在哪个命名空间里。
- outputDir:用来指定产生的档案要放在哪个资料夹。如果没特别指定,预设会放在目前资料夹底下,名称叫做 ServiceReference。简单来说,就是指定产生的档案要放在哪个资料夹。
- --sync:用来让工具除了产生非同步方法外,也同时产生同步版本的方法。
然后,我们把产生出来的资料夹,整个搬进我们的专案里面,我额外建立了一个 Service References
资料夹来存放它。
加入 System.ServiceModel.Http 套件
此时,我们的专案应该还无法建置,因为还缺少 System.ServiceModel.Http 套件,把它加入之后,应该就能顺利建置了。
测试呼叫的程式码如下:
using WebServiceClientLab.MyWebService;
var client = new WebService1SoapClient(WebService1SoapClient.EndpointConfiguration.WebService1Soap);
// 同步版本
var helloWorld = client.HelloWorld();
// 非同步版本
var helloWorldResponse =await client.HelloWorldAsync();
Console.WriteLine($"Sync: {helloWorld}");
Console.WriteLine($"Async: {helloWorldResponse.Body.HelloWorldResult}");
Console.ReadLine();
测试结果:
以上,就是如何在无法直接透过 Visual Studio 加入服务参考的情况下,改用 dotnet-svcutil 工具手动从 .wsdl 档案产生服务代理程式码的流程。完成这些设定之后,我们就能像以往一样透过熟悉的方式来呼叫服务,无论是同步还是非同步方法,都能顺利整合进应用程式中。如果刚好有遇到类似问题的朋友,希望本篇文章对你有帮助。
相关资源
C# 指南 |
ASP.NET 教学 |
ASP.NET MVC 指引 |
Azure SQL Database 教学 |
SQL Server 教学 |
Xamarin.Forms 教学 |