Я выполнял мой модульный тест Visual Studio 2008 C # с PHP WebService с использованием WCF и получил следующую ошибку:
System.ServiceModel.Security.MessageSecurityException: HTTP-запрос не авторизован клиентомСхема аутентификации «Аноним».Заголовок аутентификации, полученный от сервера, был 'NTLM, Basic realm = "(null)"'.---> System.Net.WebException: удаленный сервер возвратил ошибку: (401) Unauthorized ..
Я использую компьютер с Windows XP SP3, модульный тест VS 2008 и WCF для подключения к PHPWebService.
У меня нет контроля над PHP WebService.Я не могу изменить его (ни настройки безопасности).
Вот мой конфигурационный файл для клиента, который использует веб-сервис PHP:
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="customTextMessageEncoding"
type="COMPANY.IntegracionEasyVista.CustomTextEncoder.CustomTextMessageEncodingElement,COMPANY.IntegracionEasyVista.CustomTextEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9744987c0853bf9e" />
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="ISO8859Binding">
<customTextMessageEncoding messageVersion="Soap11WSAddressing10"
encoding="ISO-8859-1" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://serverphp/webservice/SmoBridge.php"
binding="customBinding" bindingConfiguration="ISO8859Binding"
contract="ServiceEasyVista.WebServicePortType" name="EasyVistaSvcEndPoint" />
</client>
</system.serviceModel>
Действительно, я использую код C #:
var endpointAddress = Config.AppSettings.Settings[EasyVistaSvcEndPointAddress].Value;
var endpoint = new System.ServiceModel.EndpointAddress(endpointAddress);
var endpointBinding = new System.ServiceModel.Channels.CustomBinding();
endpointBinding.Name = "ISO8859Binding";
var bindingElement = new IntegracionEasyVista.CustomTextEncoder.CustomTextMessageBindingElement();
bindingElement.Encoding = "ISO-8859-1";
bindingElement.MessageVersion = System.ServiceModel.Channels.MessageVersion.Soap11WSAddressing10; // "Soap11WSAddressing10"
endpointBinding.Elements.Add(bindingElement);
var transportBinding = new HttpTransportBindingElement();
endpointBinding.Elements.Add(transportBinding);
ConfigurarBinding(endpointBinding);
var svcClient = new WebServicePortTypeClient(endpointBinding, endpoint);
return svcClient;
Обновление: тесты
Я добавляю эту строку:
transportBinding.AuthenticationScheme = System.Net.AuthenticationSchemes.Negotiate;
Я получаю эту ошибку: HTTP-запрос не авторизован с помощью схемы аутентификации клиента «Аноним».Заголовок аутентификации, полученный от сервера, был 'NTLM, Basic realm = "(null)"'
Я добавляю эту строку:
transportBinding.AuthenticationScheme = System.Net.AuthenticationSchemes.Basic;
Я получаю эту ошибку:
System.ServiceModel.CommunicationObjectFaptedException: объект объединенных коммуникаций, System.ServiceModel.Channels.ServiceChannel, не требующий использования в общих чертах. Ошибка сервера
* 10: трассировка сервера *1030* * 10/ en System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout)
Я добавляю эту строку:
transportBinding.AuthenticationScheme = System.Net.AuthenticationSchemes.Ntlm;
Я получаю эту ошибку:
/ Exception = System.ServiceModel.CommunicationException: Версия без повторной проверки.
// Трассировка стека сервера: // en System.ServiceModel.Channels.ReceivedMessage.ReadStartEnvelope (читатель XmlDictionaryReader)
// en System.ServiceModel.Channels.StreamedMessage..ctor (читатель XmlDictionaryReader, Int32 maxSizeOfHeaders, MessageVersion wantedVersion)
// en System.ServiceModel.Channels.Message.CreateMessage (XmlDictionaryReader envelopeReader, Int32 maxSizeOfHeaders, версия MessageVersion)
// en System.ServiceModel.Channels.Message.CreateMessage (XmlReader envelopReader, Int32 maxSizeOfHersaders 1050 * 10 * 10) 1050, 1050),/ en CustomTextEncoder.CustomTextMessageEncoder.ReadMessage (Поток потока, Int32 maxSizeOfHeaders, String contentType) en E: \ TFS \ pro \ CustomTextEncoder \ CustomTextMessageEncoder.cs: línea 66
l.ReadMessage (Поток потока, Int32 maxSizeOfHeaders)
// en CustomTextEncoder.CustomTextMessageEncoder.ReadMessage (ArraySegment`1 буфер, BufferManager bufferManager, String contentType) en E: \ TFS \ pro \ пользовательский интерфейс: пользовательский текст: пользовательский интерфейс
// ru System.ServiceModel.Channels.MessageEncoder.ReadMessage (Потоковый поток, BufferManager bufferManager, Int32 maxBufferSize, String contentType)
// en System.ServiceModel.Channels.HttpInput.ReadChunkedBufferedMessage (Stream inputStream)
Я думаю, следующая правильная конфигурация (если было basichttpbinding)
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
Веб-служба WCF в basichttpbinding может быть недостаточно гибкой.CustomBinding, как следует из названия, позволяет пользователям создавать собственные привязки веб-служб.
Мне нужно использовать CustomBinding и SecurityMode (например, basichttpbinding): WCF BasicHttpBinding, эквивалентный CustomBinding
Iнужен режим безопасности: TransportCredentialOnly, Basic, HTTP транспорт и кодировка = "ISO-8859-1"
http://www.codemeit.com/security/wcf-basichttpbinding-equivalent-custombinding.html
http://social.msdn.microsoft.com/Forums/en/wcf/thread/6cefadf1-9939-4f3b-a502-2d79a30c7d3a
http://offroadcoder.com/2008/03/23/CallingYourNusoapPHPWebServiceFromWCF.aspx
http://msdn.microsoft.com/en-us/library/ms731092(v=VS.90).aspx
Я пытаюсь снова использовать эту конфигурацию и получаю сообщение об ошибке:
svcPro.ClientCredentials.UserName.UserName = "MY USER";
svcPro.ClientCredentials.UserName.Password = "XXXX";
Конфиг:
<customBinding>
<binding name="ISO8859Binding">
<customTextMessageEncoding messageVersion="Soap11WSAddressing10" encoding="ISO-8859-1" />
<!--<textMessageEncoding MessageVersion="Soap11" />-->
<!--<httpTransport />-->
<httpTransport authenticationScheme="Basic" />
</binding>
</customBinding>
Ошибка (InnerException является нулем):
Ошибка: неопознанная версия сообщения
Тип:
System.ServiceModel.CommunicationException
Mensaje: Версия de mensaje нет
reconocida. StackTrace: стек серверов
трассировка:
ан
System.ServiceModel.Channels.ReceivedMessage.ReadStartEnvelope (XmlDictionaryReader
Читатель)
ан
System.ServiceModel.Channels.StreamedMessage..ctor (XmlDictionaryReader
читатель, Int32 maxSizeOfHeaders,
MessageVersion требуемая версия)
ан
System.ServiceModel.Channels.Message.CreateMessage (XmlDictionaryReader
envelopeReader, Int32
maxSizeOfHeaders, MessageVersion
версия)
ан
System.ServiceModel.Channels.Message.CreateMessage (XmlReader
envelopeReader, Int32
maxSizeOfHeaders, MessageVersion
версия)
ан
Reale.IntegracionEasyVista.CustomTextEncoder.CustomTextMessageEncoder.ReadMessage (Stream
поток, Int32 maxSizeOfHeaders, строка
contentType) en
E: \ IntegracionEasyVista \ CustomTextEncoder \ CustomTextMessageEncoder.cs: Linea
66
ан
System.ServiceModel.Channels.MessageEncoder.ReadMessage (Stream
поток, Int32 maxSizeOfHeaders)
en Reale.IntegracionEasyVista.CustomTextEncoder.CustomTextMessageEncoder.ReadMessage (ArraySegment`1
буфер, BufferManager bufferManager,
String contentType) en
E: \ IntegracionEasyVista \ CustomTextEncoder \ CustomTextMessageEncoder.cs: Linea
60
ан
System.ServiceModel.Channels.MessageEncoder.ReadMessage (Stream
поток, BufferManager bufferManager,
Int32 maxBufferSize, String
CONTENTTYPE)
ен
System.ServiceModel.Channels.HttpInput.ReadChunkedBufferedMessage (Stream
InputStream)
ан
System.ServiceModel.Channels.HttpInput.ParseIncomingMessage (Исключение &
requestException)
ан
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan
Тайм-аут)
ан
System.ServiceModel.Channels.RequestChannel.Request (Message
сообщение, TimeSpan timeout)
ан
System.ServiceModel.Dispatcher.RequestChannelBinder.Request (Message
сообщение, TimeSpan timeout)
ан
System.ServiceModel.Channels.ServiceChannel.Call (String
действие, логическое одностороннее,
Операция ProxyOperationRuntime,
Object [] ins, Object [] outs, TimeSpan
Тайм-аут)
ан
System.ServiceModel.Channels.ServiceChannel.Call (String
действие, логическое одностороннее,
Операция ProxyOperationRuntime,
Object [] ins, Object [] outs)
ан
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage
methodCall, ProxyOperationRuntime
работа)
ан
System.ServiceModel.Channels.ServiceChannelProxy.Invoke (Шеззаде
сообщение)
Дополнительная информация: часть WDSL Service.php
<?xml version="1.0" encoding="ISO-8859-1" ?>
<definitions
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:si="http://soapinterop.org/xsd"
xmlns:tns="http://192.168.110.50/WebService" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://192.168.110.50/WebService">
<types>
<xsd:schema targetNamespace="http://192.168.110.50/WebService">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema>
</types>