使用 VS 2019 生成 SOAP 客户端时如何配置端点?

问题描述 投票:0回答:1

2019年之前

我曾经使用 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"
构建我的客户端来调用开发或生产服务。

2019年后

使用 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 客户端生成器来配置客户端端点?

准确地说,我在向导中没有找到任何选项来继续使用字符串作为端点配置。

c# .net wcf visual-studio-2019
1个回答
0
投票

不确定这是否对任何人都有帮助,但这是一个实际的例子。请注意,上面的答案是正确的......只是不够具体。

我通过右键单击项目 => 添加 => 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);

© www.soinside.com 2019 - 2024. All rights reserved.