[料理佳餚] 使用 dotnet-svcutil 手动从 WSDL 档案产生代理类别并整合进 .NET Core 专案

以往我们要呼叫 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 教学

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章

5 点赞(415) 阅读(67)