1

WCF を使用して WebService PHP で Visual Studio 2008 単体テスト C# を実行していたところ、次のエラーが発生しました。

System.ServiceModel.Security.MessageSecurityException: HTTP 要求は、クライアント認証スキーム 'Anonymous' で承認されていません。サーバーから受信した認証ヘッダーは「NTLM,Basic realm="(null)"」でした。---> System.Net.WebException: リモート サーバーがエラーを返しました: (401) Unauthorized..

PHP WebServiceに接続するために、Windows XP SP3マシン、単体テストVS 2008、およびWCFを使用しています。

PHP WebService を制御できません。変更できません(構成セキュリティもありません)。

Web サービス 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.CommunicationObjectFaultedException: El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no se puede usar para la la comunicación porque se encuentra en el estado Faulted.

//サーバー スタック トレース: // ja System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan タイムアウト)

次の行を追加します。

 transportBinding.AuthenticationScheme = System.Net.AuthenticationSchemes.Ntlm;

私はこのエラーを受け取ります:

/Exception = System.ServiceModel.CommunicationException: バージョンが不明です。

// サーバー スタック トレース: // ja System.ServiceModel.Channels.ReceivedMessage.ReadStartEnvelope(XmlDictionaryReader リーダー)

// en System.ServiceModel.Channels.StreamedMessage..ctor(XmlDictionaryReader reader, Int32 maxSizeOfHeaders, MessageVersion desiredVersion)

// en System.ServiceModel.Channels.Message.CreateMessage(XmlDictionaryReader エンベロープリーダー、Int32 maxSizeOfHeaders、MessageVersion バージョン)

// en System.ServiceModel.Channels.Message.CreateMessage(XmlReader エンベロープリーダー、Int32 maxSizeOfHeaders、MessageVersion バージョン)

// en CustomTextEncoder.CustomTextMessageEncoder.ReadMessage(Stream stream, Int32 maxSizeOfHeaders, String contentType) en E:\TFS\pro\CustomTextEncoder\CustomTextMessageEncoder.cs:línea 66

// en System.ServiceModel.Channels.MessageEncoder.ReadMessage(ストリーム ストリーム, Int32 maxSizeOfHeaders)

// en CustomTextEncoder.CustomTextMessageEncoder.ReadMessage (ArraySegment`1 buffer, BufferManager bufferManager, String contentType) en E:\TFS\pro\CustomTextEncoder\CustomTextMessageEncoder.cs:línea 60

// en 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>

basichttpbinding での WCF の Web サービスは、柔軟性に欠ける可能性があります。CustomBinding は、その名前が示すように、ユーザーが独自の Web サービス バインディングを設計できることを示しています。

CustomBindingと SecurityMode (basichttpbinding など) を使用する必要があります: WCF BasicHttpBinding と同等の CustomBinding

セキュリティ モードが必要です: TransportCredentialOnly、Basic、HTTP transport、および encoding="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 が null):

エラー: メッセージのバージョンを認識できません

ヒント: System.ServiceModel.CommunicationException 説明: バージョンは不明です。スタック トレース: サーバー スタック トレース:

System.ServiceModel.Channels.ReceivedMessage.ReadStartEnvelope(XmlDictionaryReader リーダー)

System.ServiceModel.Channels.StreamedMessage..ctor(XmlDictionaryReader リーダー、Int32 maxSizeOfHeaders、MessageVersion desiredVersion)

System.ServiceModel.Channels.Message.CreateMessage(XmlDictionaryReader エンベロープリーダー、Int32 maxSizeOfHeaders、MessageVersion バージョン)

ja System.ServiceModel.Channels.Message.CreateMessage(XmlReader エンベロープリーダー、Int32 maxSizeOfHeaders、MessageVersion バージョン)

ja Reale.IntegracionEasyVista.CustomTextEncoder.CustomTextMessageEncoder.ReadMessage(Stream stream, Int32 maxSizeOfHeaders, String contentType) ja E:\IntegracionEasyVista\CustomTextEncoder\CustomTextMessageEncoder.cs:línea 66

System.ServiceModel.Channels.MessageEncoder.ReadMessage(ストリーム ストリーム、Int32 maxSizeOfHeaders) Reale.IntegracionEasyVista.CustomTextEncoder.CustomTextMessageEncoder.ReadMessage(ArraySegment`1 バッファ、BufferManager bufferManager、文字列 contentType) E:\IntegracionEasyVista\CustomTextEncoder\CustomTextMessageEncoder.cs :リネア 60

ja System.ServiceModel.Channels.MessageEncoder.ReadMessage(ストリーム ストリーム, BufferManager bufferManager, Int32 maxBufferSize, String contentType)

ja System.ServiceModel.Channels.HttpInput.ReadChunkedBufferedMessage(Stream inputStream)

ja System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception& requestException)

System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan タイムアウト)

ja System.ServiceModel.Channels.RequestChannel.Request(メッセージ メッセージ、TimeSpan タイムアウト)

ja System.ServiceModel.Dispatcher.RequestChannelBinder.Request(メッセージ メッセージ、TimeSpan タイムアウト)

ja System.ServiceModel.Channels.ServiceChannel.Call(String アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan タイムアウト)

ja System.ServiceModel.Channels.ServiceChannel.Call(文字列アクション, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] outs)

ja System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime 操作)

ja System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ)

詳細: Service.php の WDSL の一部

<?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>
4

1 に答える 1

1

PHP サービスには認証が必要ですが、クライアントは何も送信しません。認証をサポートするようにカスタム バインディングを変更します。httpTransport 要素で認証を設定できます。

<httpTranposrt authenticationScheme="..." />

Basic または Negotiate を使用します。Basicでは、サービスと通信するときにクライアント資格情報を提供する必要があります。ネゴシエートでは、サービスとクライアントの両方が同じドメインにある必要があります。

于 2011-02-08T09:53:02.657 に答える