C#/WCF无法使用wsdl发出与SOAP ui中相同的请求



我有一个WSDL,在那里我可以通过soap成功地发送有效负载,有必要选择先发制人的授权,授权是基本的,如图所示。

样品肥皂ui

#预期的Auth标头-

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="test" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username> username</wsse:Username> 
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"> password </wsse:Password>
</wsse:UsernameToken> 
</wsse:Security>

在创建客户端时尝试了许多绑定~根据文档,它应该是用户名

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; ```
--------------
var bindingws = new WSHttpBinding(SecurityMode.TransportWithMessageCredential);
var bindinghttps = new BasicHttpsBinding(BasicHttpsSecurityMode.TransportWithMessageCredential);
bindinghttps.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;```
----------------
var basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
basicHttpBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;```
InboundPortClient client = new InboundPortClient(basicHttpBinding, endpointAddress);

client.ClientCredentials.UserName.UserName = "";
client.ClientCredentials.UserName.Password = "";
client.Open();//ok
client.updateCall(null);

//error-System.ServiceModel.ProtocolException:'内容类型text/html;响应消息的charset=utf-8不匹配绑定的内容类型(text/xml;charset=utf-8(。如果使用自定义编码器,请确保IsContentTypeSupported方法已正确实现。响应的前1024个字节是:--拒绝访问页面

基本上,我所理解的约束是不正确的关于如何使用wcf/.net框架在客户端中模拟soap的任何想法。

为每个请求手动设置标题


var emptybinding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
//create client
ServiceReference.InboundPortClient client = new
ServiceReference.InboundPortClient(emptybinding,
endpointAddress);
// expects username 
client.ClientCredentials.UserName.UserName = "xyz";
client.ClientCredentials.UserName.Password = "123";
using (new OperationContextScope(client.InnerChannel))
{
// Add a HTTP Header to an outgoing request
string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(client.ClientCredentials.UserName.UserName + ":" + client.ClientCredentials.UserName.Password));
HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
requestMessage.Headers["Authorization"] = auth;
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
client.Doyourstuffhere();
}

最新更新