我曾经使用 Visual Studio 2017 或 Rider 生成客户端以使用 WCF 服务(行为相同)。所发生的情况是,生成的客户端继承了
System.ServiceModel.ClientBase
,我可以通过生成的客户端将端点配置传递给此 ClientBase
。生成的代码如下所示:
public partial class GeneratedSoapClient : ClientBase<GeneratedSoapClient>
{
public GeneratedSoapClient (string endpointConfigurationName) :
base(endpointConfigurationName)
{
}
// ...
}
这允许在主机的
app.config
中添加一些端点:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MySoap" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://dev.my_service.net?asmx"
binding="basicHttpBinding" bindingConfiguration="MySoap"
name="MyService_Dev" />
<endpoint address="http://prod.my_service.net?asmx"
binding="basicHttpBinding" bindingConfiguration="MySoap"
name="MyService_Prod" />
</client>
</system.serviceModel>
然后我使用
"MyService_Dev"
或 "MyService_Prod"
构建我的客户端来调用开发或生产服务。
使用 Visual Studio 2019,代码生成有所不同。它不会生成
svcmap
和 webref
文件。相反,它会生成一个包含信息的 json
文件。
在 C# 代码中,生成的客户端不再接受端点配置作为字符串,现在它需要一个枚举,然后直接在代码中解析端点:
public enum EndpointConfiguration
{
ServiceHttpSoap11Endpoint,
ServiceHttpSoap12Endpoint,
}
class GeneratedSoapClient : ClientBase<GeneratedSoapClient>
{
public GeneratedSoapClient(EndpointConfiguration endpointConfiguration) :
base(/* Binding, not related to my issue*/, GetEndpointAddress(endpointConfiguration))
{
}
private static GetEndpointAddress(EndpointConfiguration endpointConfiguration)
{
if (endpointConfiguration == EndpointConfiguration.ServiceHttpSoap11Endpoint)
{
return new EndpointAddress("http://prod.my_service.net?asmx");
}
if (endpointConfiguration == EndpointConfiguration.ServiceHttpSoap12Endpoint)
{
return new EndpointAddress("http://prod.my_service.net?asmx");
}
throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
}
}
在这种情况下,我无法配置自己的端点,因为我不想修改生成的代码,因为这是一种不好的做法。每次合同发生变化时,都需要在再生后应用相同的“补丁”。在这种情况下,
我应该如何使用最新的 WCF 客户端生成器来配置客户端端点?
准确地说,我在向导中没有找到任何选项来继续使用字符串作为端点配置。
不确定这是否对任何人都有帮助,但这是一个实际的例子。请注意,上面的答案是正确的......只是不够具体。
我通过右键单击项目 => 添加 => Web 引用添加了一个新的“Web 引用”。当出现提示时,我将其命名为 EUSelfServWS 并指定了 wsdl url。这生成了存储在名为 Services 的文件夹中的代理类。
实例化客户端实例: var svc = new EAUToEUSS.PerformanceTest.Service.ServiceSoapClient(ServiceSoapClient.EndpointConfiguration.ServiceSoap);
注意ServiceSoapClient对象要求您指定是否使用ServiceSoap或ServiceSoap12。这是一个枚举。
使用 URL 实例化实例: var endpointAddr = new EndpointAddress("https://YOUR.server.com/EUSelfServWS/Service.asmx"); var svc = new EAUToEUSS.PerformanceTest.Service.ServiceSoapClient(ServiceSoapClient.EndpointConfiguration.ServiceSoap, endpointAddr);