.NET Core 3.1添加Web Service报错,求FW2.0兼容代码生成方案
针对你遇到的问题,本质是旧版Web服务(适配.NET Framework 2.0 Web引用)和.NET Core默认服务引用生成的客户端在序列化、绑定配置上不兼容导致的。可以通过以下几种方式模拟FW2.0 Web引用的行为:
1. 调整dotnet-svcutil的生成参数
默认安装的dotnet-svcutil可能采用DataContractSerializer,而FW2.0 Web引用默认使用XmlSerializer,这是核心差异之一。执行以下命令生成兼容的客户端代码:
dotnet-svcutil <你的WSDL地址> --serializer XmlSerializer --namespace "*,你的命名空间"
生成代码后将文件添加到项目中,同时检查生成的配置文件(如appsettings.json)里的绑定配置,确保为BasicHttpBinding,并手动调整以下属性(若服务无需安全验证):
"BasicHttpBinding_你的服务接口名": { "Binding": "BasicHttpBinding", "EndpointConfiguration": "BasicHttpBinding_你的服务接口名", "Address": "你的服务地址", "BindingConfiguration": { "Security": { "Mode": "None" }, "MessageEncoding": "Text", "MaxReceivedMessageSize": 2147483647 } }
2. 手动生成旧版风格的代理类
使用.NET Framework的svcutil.exe(可从Visual Studio工具目录找到,如C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\svcutil.exe)执行旧版参数生成代码:
svcutil.exe <你的WSDL地址> /t:code /serializer:XmlSerializer /out:你的服务代理类.cs /namespace:*,你的命名空间
将生成的.cs文件复制到.NET Core项目中,同时添加System.Web.Services NuGet包(适配.NET Core的旧版ASMX客户端),之后直接创建客户端实例调用服务:
var client = new 你的服务代理类(); client.Url = "你的服务地址"; // 按需配置旧版特性,如Cookie容器 client.CookieContainer = new System.Net.CookieContainer(); // 调用服务方法 var result = client.你的服务方法();
这类代理类继承自SoapHttpClientProtocol,和FW2.0 Web引用的行为完全一致。
3. 修正SOAP Action格式
部分旧版Web服务对SOAP Action的格式要求严格,新版服务引用生成的客户端可能发送的格式不符合要求。可以通过Fiddler对比FW2.0 Web引用和Core客户端的请求,查看SOAP Action的差异,然后手动在Core客户端的方法上添加特性指定:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("你的SOAP Action完整地址", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public 返回类型 你的服务方法(参数类型 参数名) { // 方法实现 }
内容的提问来源于stack exchange,提问作者makse

