0

ASP.NET Web サービスから WCF に移行する必要があります。現在のコードは次のようになります。

サーバ側:

    public class MyType
    {
    public int x;
    public string s;
    }

    public class MyService : WebService
    {
    public MyType myObj;

    [WebMethod]
    [SoapHeader("myObj", Direction=SoapHeaderDirection.InOut)]
    public string SomeMethod() // NO Parameter!!!
    {
            if (myObj.x > 5)
               return myObj.s;
            else
               return "Less than 5";    
        }
    }
</code>

クライアント側:

    MyService service = new MyService();
    MyType m = new MyType();
    m.x = 10;
    m.s = "That's it!!!";
    service.myObj = m;
    string s = service.SomeMethod();

これはスムーズに動作します。これを WCF に変更する必要があります。WCF で SOAP ヘッダーに署名する方法に関する多くのトピックが見つかりましたが、すべて MessageContract をクラスの属性として使用する方法に関するもので、操作にパラメーターとして与えられます。このような:

<code>
    [MessageContract]
    public class MyType
    {
       public int x;
       public string s;
    }

    [OperationContract]
    public string SomeMethod(MyType myType)
    {

    } </code>

しかし、これは私が必要とするものではありません。私のメソッドは同じままでなければなりません (パラメーターなし)。

WCFExtra lib を使用したり、Client Dispatcher インターフェイスを実装して、すべての送信要求に SOAP ヘッダーを追加したりすることについて話しているブログはほとんどありません。しかし、繰り返しになりますが、Web サービスを WCF に移行してもクライアントに影響を与えず、コードを変更する必要はなく、.asmx 拡張子を持つ Web サービスを使用できるようにする必要があります。また、現在の Web サービスは MTOM と WSE-3 を使用しています。簡単な方法はありますか?

これで私を助けてください。

すでに以下の記事を読みましたが、SOAP ヘッダー、WSE-3 の処理方法については触れていません。

http://megakemp.com/2008/11/27/migrating-aspnet-web-services-to-wcf/
http://megakemp.com/2008/11/27/migrating-aspnet-web-services-to-wcf/
http://vikasbhardwaj15.blogspot.in/2012/05/convert-asmx-web-services-to-wcf.html
http://blogs.msdn.com/b/trobbins/archive/2006/12/02/integrating-wcf-with-your-existing-asmx-services.aspx
http://blogs.msdn.com/b/kaevans/archive/2006/10/05/phased-migration-from-asmx-to-wcf.aspx
http://www.manas.com.ar/waj/2007/05/31/asmx-to-wcf-migration/
4

1 に答える 1

1

以前は、asmx から WSDL を抽出していました。次に、引数 を指定してsvcutil/mcに対して実行します。これにより、サービス コントラクトとメッセージ コントラクトが生成されます。次に、同じように動作するようにコードをリファクタリングします。ほとんどの場合は機能しますが、いくつかの落とし穴があります。

投稿したコードから、次のように、「myObj」を要求および応答メッセージのヘッダーとしてカプセル化する必要があります。

[DataContract]
public class MyType
{
    [DataMember]
    public int x;

    [DataMember]
    public string s;
}

[MessageContract]
public class SomeMethodRequestMessage
{
    [MessageHeader] public MyType myObj;
}

[MessageContract]
public class SomeMethodResponseMessage
{
    [MessageHeader] public MyType myObj;
    [MessageBodyMember] public string result;
}

// Inside your service contract

[OperationContract]
public SomeMethodResponseMessage SomeMethod(SomeMethodRequestMessage message)
{
   // do stuff
}

メッセージ コントラクトの使用を参照してください。

于 2013-10-07T07:03:55.437 に答える