Приложение 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# код клиента выборочными:
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
) заголовок?
Я предположил бы, что в вашем коде # клиента C, вам не нужно, чтобы добавить 'MessageHeader.CreateHeader (...' строка "Authorization" Эта строка генерируется автоматически, когда вы устанавливаете аутентификацию на базовый язык и используете имя пользователя с паролем. 'YTph' - это фактически ваше имя пользователя и пароль, закодированные по базе 64. Обязательно используйте SSL, если это производственный код. – oleksii
Это сработало для меня. http://stackoverflow.com/questions/20495105/basic-authentication-in-php-webservice-with -c/20517700 # 20517700 Имейте пример кода. – Paulo