.NET Core中WCF服务引用如何指定Via地址?
解决.NET Core中对接老式WSE风格服务的EndpointReference参数问题
思路1:使用EndpointAddress替代并配置Via属性
.NET Core中推荐用System.ServiceModel.EndpointAddress处理服务地址,它支持单独设置Via属性,对应WSE里EndpointReference第二个参数的路由地址功能:
var serviceUrn = "urn:some-urn-removed-here"; var actualServiceUrl = "https://the-actual-webservice-url.com/something.asmx"; // 基于URN创建基础EndpointAddress var baseAddress = new EndpointAddress(new Uri(serviceUrn)); // 构建带Via的EndpointAddress var endpointAddressWithVia = new EndpointAddress( baseAddress.Uri, baseAddress.Identity, baseAddress.Headers, new Uri(actualServiceUrl), // 指定实际调用的路由地址(Via) new Uri(actualServiceUrl) // 若服务需要,可同时设置ReplyTo地址 ); // 实例化服务客户端时传入该地址 var serviceClient = new YourGeneratedServiceClient(endpointAddressWithVia);
说明:EndpointAddress的多参数构造函数可以分离逻辑服务标识(URN)和实际调用地址(Via),完美匹配原WSE代码的需求。
思路2:手动构造SOAP请求(底层控制)
如果自动生成的WCF客户端配置麻烦,可直接用HttpClient手动发送SOAP请求,显式设置SOAP头中的To为URN,请求发送到实际URL:
using var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("https://the-actual-webservice-url.com/"); // 构造包含To头的SOAP envelope var soapRequest = @"<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/""> <s:Header> <To xmlns=""http://schemas.microsoft.com/ws/2005/05/addressing/none"">urn:some-urn-removed-here</To> </s:Header> <s:Body> <!-- 替换为你的具体服务请求内容 --> <YourOperation xmlns=""http://your-service-namespace/""> <Parameter1>Value1</Parameter1> </YourOperation> </s:Body> </s:Envelope>"; var content = new StringContent(soapRequest, Encoding.UTF8, "text/xml"); var response = await httpClient.PostAsync("something.asmx", content); // 处理响应 var responseContent = await response.Content.ReadAsStringAsync();
说明:这种方式绕过WCF客户端限制,完全控制请求的每个部分,适合兼容性要求高的老式ASMX服务。
思路3:验证URN是否为非必需项
部分老式服务的URN仅作为服务契约标识,实际调用时直接用URL即可正常工作。可以先尝试跳过URN,直接用实际URL创建地址:
var actualServiceUrl = "https://the-actual-webservice-url.com/something.asmx"; // 直接使用实际URL创建EndpointReference var endpointRef = new EndpointReference(new Uri(actualServiceUrl)); // 或者用EndpointAddress var endpointAddress = new EndpointAddress(new Uri(actualServiceUrl));
说明:如果服务不校验SOAP头中的To字段,这种方法是最简单可行的。
内容的提问来源于stack exchange,提问作者HaukurHaf
相关产品推荐
相关产品推荐

