BasicHttpBinding эквивалент CustomBinding с использованием клиента WCF и PHP WebService - PullRequest
1 голос
/ 08 февраля 2011

Я выполнял мой модульный тест 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>

1 Ответ

1 голос
/ 08 февраля 2011

Ваша служба PHP требует проверки подлинности, но ваш клиент не отправляет ее. Измените пользовательскую привязку для поддержки аутентификации. Вы можете установить аутентификацию в элементе httpTransport:

<httpTranposrt authenticationScheme="..." />

Использовать базовый или согласовать. Basic потребует от вас предоставить учетные данные клиента при взаимодействии со службой. Для согласования потребуется, чтобы и служба, и клиент находились в одном домене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...