2

WSEを使用してasmxWebサービスに接続する.NET2.0FormsAppクライアントがあります。

サービスをWCFにアップグレードし、VS2010と.NET4を利用したいのですが、既存の(企業の)顧客にクライアントソフトウェア/フレームワークなどを更新させることはできません。そのため、私たちはそのような立場にあります。サービスをアップグレードする唯一の方法は、下位互換性を維持できるかどうかです。

顧客側でapp.configを更新できますが、実行可能ファイルは更新できません。つまり、新しいサービス参照を追加することはできません。

クライアントに変更を加えずに、クライアントアプリからの呼び出しを受け入れるようにWCFサービスを構成しようとして失敗しました。私はこれができるとは思えません。もちろん、クライアントに新しい参照を追加すると機能しますが、既存の参照を使用して新しいサービスで「偽造」しようとしても機能しません。

サービス側の構成は次のようになります。

<bindings>
  <basicHttpBinding>
    <binding name="OnePointOneBinding" bypassProxyOnLocal="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="ServiceBehaviour" name="xyz.Services.xyzService">
    <endpoint binding="basicHttpBinding" bindingConfiguration="OnePointOneBinding"
      name="BasicBindingSvc" contract="xyz.Services.IxyzService" />
  </service>
</services>

私たちが得ているエラーは次のとおりです。

EndpointDispatcherでのContractFilterの不一致により、アクション'http://webservices.xyz.co.uk/xyz/DoTest'のメッセージを受信者で処理できません。これは、コントラクトの不一致(送信者と受信者の間のアクションの不一致)または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインディング(メッセージ、トランスポート、なしなどのセキュリティ要件を含む)を持っていることを確認します。

喜んで受け取った入力

4

1 に答える 1

0

上記のいくつかの WSE 仕様:

wse3PolicyCache.config から:

<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
  <extensions>
    <extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </extensions>
  <policy name="usernameTokenSecurity">
    <usernameOverTransportSecurity />
    <requireActionHeader />
  </policy>
</policies>

クライアント app.config から:

<microsoft.web.services3>
    <security>
        <!-- Specifies the time buffer used by WSE to determine when a SOAP message is valid. -->
        <timeToleranceInSeconds value="7200" />
        <!-- Defines the default number of seconds that a SOAP message is valid after its creation. -->
        <defaultTtlInSeconds value="300" />
    </security>
    <policy fileName="wse3policyCache.config" />
</microsoft.web.services3>

他に何が関連するのかわかりません...

編集:

そこで、掘り下げてみると、WCF サービスの WSDL に、名前空間に追加されているインターフェイスの名前 (「IService」と名付けた) が含まれていることがわかりました。クライアントがhttp://xyx/IServiceになっている場合http://xyz/productname が必要です。そのため、インターフェイスの名前を「productname」に変更したところ、名前空間が正しくなりました。これにより、次の(新しい)エラーが発生しました。

操作 'Authorise2' の要求メッセージの本文を逆シリアル化中にエラーが発生しました。OperationFormatter で無効なメッセージ本文が検出されました。名前が「Authorise2」で名前空間が「http://xzz」のノード タイプ「Element」が見つかるはずです。名前が「Authorise2」で名前空間が「http://xzz/productname」のノード タイプ「Element」が見つかりました

インターフェイスには次の署名があります。

[ServiceContract(Namespace = "http://xyz")] public interface productname { [OperationContract] AuthorisationDetails Authorise2(文字列のユーザー名、文字列のパスワード); }

では、'productname' 拡張子はどのように追加されるのでしょうか? もっと言えば、どうすればそれを取り除くことができますか?

于 2011-09-08T10:06:27.403 に答える