如何使用c#以编程方式描述的服务以编程方式指定绑定和端点?

时间:2018-03-23 09:20:15

标签: c# .net wcf soap

所以我在项目的app.config中有以下数据,该项目有一个服务引用:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="P4U" />
            <binding name="P4U1">
                <security mode="TransportWithMessageCredential" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://*.svc"
            binding="basicHttpBinding" bindingConfiguration="P4U" contract=*.ServiceContract"
            name="P4U" />
        <endpoint address="https://*.svc"
            binding="basicHttpBinding" bindingConfiguration="P4U1" contract="*.ServiceContract"
            name="P4U1" />
    </client>
</system.serviceModel>

我无法在配置中使用此数据。相反,我必须在代码中创建它们。我使用BasicHttpBinding,它适用于http调用,但我可以让它适用于https。我尝试了basichttps和wshttpbinding。用户名和密码在标头中发送。知道该怎么办? 我尝试使用带有basichttp和basichttps的TransportWithMessageCredential。

以下详细信息来自客户文档:

  

对于每个请求,都需要SOAP标头,如示例中所示:   ...

<soap:Header>
<Authentication xmlns="http://*">
<User>customer specific, to be provided</User>
<Password>customer specific, to be provided</Password>
</Authentication>
</soap:Header>

以下代码是我现在拥有的。它是构造函数:

private Binding serviceBinding ;    
public ShippingService(string url, AuthenticationHeader webAuthenticationHeader, LogHelper logger)
    {
        authenticationHeader = webAuthenticationHeader;
        this.Logger = logger;
        var uri = new Uri(url);
        if(uri.Scheme== "https")
        {
            this.serviceBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
        }
        else
        {
            this.serviceBinding = new BasicHttpBinding();
        }

        this.endpointAddress = new EndpointAddress(url);
    }

在服务电话方法中,我有以下一行:

ServiceContractClient clientService = new ServiceContractClient (serviceBinding, endpointAddress);

当我使用wshttpbinding时,我得到的第一个例外是下面的一个:

  

内容类型application / soap + xml;服务https://*ervice.svc不支持charset = utf-8。客户端和服务绑定可能不匹配。对于HTTP。

我改回基础,从那以后我只得到以下例外:

  

通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态。

1 个答案:

答案 0 :(得分:0)

如果您最终得到的异常并未提供有关根本原因(如我们所获得的故障状态)的大量线索,请执行以下步骤以指导您找到可能的解决方案

  1. 更新web.config以生成服务日志 https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/configuring-message-logging

  2. 运行应用程序,以便您点击错误

  3. 打开服务日志以查找根本原因

  4. [ServiceLogError] https://imgur.com/a/3wPgo

    我收到错误:未提供用户名。即使在调试时,我得到的例外是服务处于故障状态。

    1. 使用谷歌的力量: https://amadotech.blogspot.in/2009/11/error-username-is-not-provided-specify.html
    2. 所以简而言之,我不得不添加以下两行代码 clientService.ClientCredentials.UserName.UserName =&#34; xyz&#34 ;; clientService.ClientCredentials.UserName.Password =&#34; 123&#34 ;;

      其余代码保持不变