2014-01-15 49 views
2

应用程序SoapUI我为端点设置了密码和用户名。当您调用该方法时,这些数据不会在消息头中传输,而会在其外部传输(Authorization: Basic YTph)。但是,在这种情况下,呼叫被成功认证。如果我尝试在我的c#客户端应用程序的标题中添加身份验证数据,则该服务不会看到用户名。授权:SOAP服务客户端中的基本

了SoapUI:

POST https://xxx.xx:9444/xx HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: text/xml;charset=UTF-8 
SOAPAction: "" 
Authorization: Basic YTph 
Content-Length: 470 
Host: xx.loc:9444 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ami="http://xxx.pl"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ami:getMeterPointStates> 
     <addr> 
      <ppec>0</ppec> 
      <mid>0</mid> 
     </addr> 
     <start>2012-04-01T00:00:00</start> 
     <stop>2012-05-01T00:00:00</stop> 
     <hard>false</hard> 
     </ami:getMeterPointStates> 
    </soapenv:Body> 
</soapenv:Envelope> 

C#客户samle代码:

System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(RemoteCertValidate); 
CommunicationWebserviceClient client = new CommunicationWebserviceClient(); 

client.ClientCredentials.UserName.UserName = "user"; 
client.ClientCredentials.UserName.Password = "password"; 

using (new System.ServiceModel.OperationContextScope(client.InnerChannel)) 
{ 
    MessageHeader head = MessageHeader.CreateHeader("Authorization", "http://xxx.pl", "Basic YTph"); 
    OperationContext.Current.OutgoingMessageHeaders.Add(head); 

    MeterPointAddr addr = new MeterPointAddr(); 
    addr.ppec = "0"; 
    addr.mid = "0"; 

    var response = client.getMeterPointStates(addr, new DateTime(2012, 4, 1), new DateTime(2012, 4, 14), false, "", measurementsFlagEnum.REAL_ESTIMATION); 
} 

的App.config:

<bindings> 
    <customBinding> 
     <binding name="CommunicationWebservicePortBinding"> 
      <textMessageEncoding messageVersion="Soap11" /> 

      <httpsTransport authenticationScheme="Basic" /> 
     </binding> 
    </customBinding> 
</bindings> 
<client> 
    <endpoint address="https://xxx.xx:9444/xx" 
     binding="customBinding" bindingConfiguration="CommunicationWebservicePortBinding" contract="AMIService.CommunicationWebservice" 
     name="CommunicationWebservicePort" /> 
</client> 

如何添加C#编写的一个客户端(Authorization: Basic YTph)头?

+0

我猜你的C#的客户端代码,你并不需要添加'MessageHeader.CreateHeader(“授权” ...'线解决方案。当你将认证设置为basic并且使用用户名和密码时,这条线是自动生成的.YTph'实际上是你的用户名和密码,base-64编码。如果这是产品代码,请确保使用SSL。 – oleksii

+0

它工作正常对我来说 http://stackoverflow.com/questions/20495105/basic-authentication-in-php-webservice-with -c/20517700#20517700 有一个代码示例。 – Paulo

回答