所以我在项目的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状态。
答案 0 :(得分:0)
如果您最终得到的异常并未提供有关根本原因(如我们所获得的故障状态)的大量线索,请执行以下步骤以指导您找到可能的解决方案
更新web.config以生成服务日志 https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/configuring-message-logging
运行应用程序,以便您点击错误
打开服务日志以查找根本原因
[ServiceLogError] https://imgur.com/a/3wPgo
我收到错误:未提供用户名。即使在调试时,我得到的例外是服务处于故障状态。
所以简而言之,我不得不添加以下两行代码 clientService.ClientCredentials.UserName.UserName =&#34; xyz&#34 ;; clientService.ClientCredentials.UserName.Password =&#34; 123&#34 ;;
其余代码保持不变