1

ここでは WCF 初心者ですが、.NET 4.0 クライアントが JBOSS でホストされている Web サービスを使用できるようにしようとしています。Web サービスからの結果は、x-fire を使用してシリアル化されていると思います。クライアント側は WCF を使用してサービスに接続しています。これは、Ntlm を使用して呼び出し元を認証する内部 Web サービスにあります。

クライアントにサービス参照を追加し、サーバー上のメソッドの 1 つを呼び出すことができます。リクエストが送信されていることを確認しました。実際にレスポンスが返ってきています。問題は、応答が従来の SOAP 形式ではないことです。標準の WCF バインディングではこれを解釈できないと思います。アプリに関する情報は次のとおりです。

app.config

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
          <binding name="myBinding" >
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                  realm="" />
              <message clientCredentialType="UserName" algorithmSuite="Default"  />
            </security>
          </binding>
        </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://server/services/WS" binding="basicHttpBinding"
          bindingConfiguration="myBinding" contract="myContract"
          name="myEndpoint" />
    </client>
  </system.serviceModel>

リクエストがサーバーに送信されています...

POST http://server/services/WS HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Accept-Encoding: gzip, deflate,gzip, deflate,gzip, deflate
Authorization: NTLM
Host: server
Content-Length: 145

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><getAppInfo xmlns="http://ws.application.com"/></s:Body></s:Envelope>

サーバーから返される応答 (フィドラーから取得)...

HTTP/1.1 200 OK
Connection: close
Date: Mon, 18 Jun 2012 19:48:04 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Set-Cookie: blah; Path=/
Content-Type: multipart/related; type="application/xop+xml"; start="<soap.xml@xfire.codehaus.org>"; start-info="text/xml";      boundary="----=_Part_14_20837339.1340048884628";charset=UTF-8


------=_Part_14_20837332219.1340048884628
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: 8bit
Content-ID: <soap.xml@xfire.codehaus.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><getAppInfoResponse xmlns="http://ws.app.com"><out><apiVersion xmlns="http://dto.ws.app.com">55</apiVersion><dbBuildNumber xmlns="http://dto.ws.app.com">12312</dbBuildNumber><appBuildNumber xmlns="http://dto.ws.app.com" xsi:nil="true" /></out></getAppInfoResponse></soap:Body></soap:Envelope>
------=_Part_14_20837332219.1340048884628--

.netクライアントからのエラーメッセージは次のとおりです...

The content type multipart/related; type="application/xop+xml"; start="<soap.xml@xfire.codehaus.org>"; start-info="text/xml";       boundary="----=_Part_14_20837332219.1340048884628";charset=UTF-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 738 bytes of the response were: '

残りの例外は、サーバーからの最初の応答を繰り返すだけです。

私の推測では、カスタム バインディングなどを作成する必要があります。これを行う方法の良い例を探してみましたが、それらはすべて、すべてを接続するのを妨げる何かを除外しているようです。カスタム バインディングを機能させることができれば、応答を解析し、------ 行の間のすべてを WCF デシリアライザーに渡すことになると思います。これは実際の SOAP 応答であるためです。

これを行う方法、従うべき良い例、またはおそらくまったく別のアプローチについて誰かアイデアがありますか?

ところで、Web サービスはブラック ボックスであり、そこでコーディングを変更することはできません。

ありがとう。

4

2 に答える 2

4

バインディング構成を次のように変更してみてください。

<binding name="myBinding" messageEncoding="Mtom">

ご覧のとおり、messageEncoding は Mtom に設定されており、これが JBoss サーバーから返された問題を処理します。

このエンコーディング タイプの詳細については、MTOMを参照してください。

于 2012-06-19T04:05:44.550 に答える
0

セキュリティのことは省いてください

<security mode="TransportCredentialOnly">
              <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                  realm="" />
              <message clientCredentialType="UserName" algorithmSuite="Default"  />
            </security>

あなたのバインディングから。メッセージは設定に従って保護されるため、JBOSS ディスパッチャ モデルは WCF ディスパッチャとは異なるため、メッセージを復号化できませんでした。

于 2012-06-19T03:41:19.287 に答える