0

私はこれに 5 時間を費やしましたが、このコントラクトファーストの仕様 (「アグレッシブな」締め切り、つまりばかげた) を書くのにすでに 30 時間かかりましたが、何が欠けているのかわかりません。

障害が予想されるため、一方向の操作は必要ありません。私はすでに単純な WCF サービスを構築し、それ生成する WSDL を調べました。それはvoid メソッドへのラウンドトリップを行いますが、私はそれを長い間見つめてきました (そして WSDL 1.1 は最高の時でも非常に面倒です - 2.0 にロールバックします)お願いします)手品が何なのか、もう見えません。

魔法を説明する非常に単純な WSDL を提供できる人はいますか? この WSDL では、jax-ws 2.2 と WCF 3.5/4.0 の両方をターゲットにしています。私は WSDL を手書きしており、(Java または .net で) プロキシを構築しようとするたびに、常に戻りメッセージを含むメソッドを構築します。私はそれを失っています。

4

1 に答える 1

4

「void」メソッドは、必ずしもそれが一方向の操作であることを意味するわけではありません。以下の 2 つの操作は異なります。

[ServiceContract]
public interface ITest
{
    [OperationContract(IsOneWay = true)]
    void Process1();
    [OperationContract]
    void Process2();
}

最初のものは実際には一方向の操作です-サーバーによってスローされた例外/障害はクライアントに伝播されませんが、2番目のものでは、サーバーが例外をスローした場合、何も「返されません」例: a FaultException)、例外は呼び出し元に返されます。

更新: タイトルで提起された質問に答えるために、操作の出力メッセージのスキーマが空の場合、WSDL パーサーは void 操作 (少なくとも WCF で使用されるもの) を生成することを決定します。

たとえば、以下のコードでは:

public class StackOverflow_8316567
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract(IsOneWay = true)]
        void Process1();
        [OperationContract]
        void Process2();
        [OperationContract]
        int Add(int x, int y);
    }
    public class Service : ITest
    {
        public void Process1() { }
        public void Process2() { }
        public int Add(int x, int y) { return x + y; }
    }
    static Binding GetBinding()
    {
        var result = new BasicHttpBinding();
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

これを実行してhttp://localhost:8000/service?wsdlを参照すると、次のように表示されます。

  1. 操作Process1(wsdl:portType/wsdl:operation の下) には入力メッセージしかありません
  2. both Addand Process2(r/r operations) には、入力メッセージと出力メッセージの両方があります。

ここで、これら 2 つの操作の出力メッセージのメッセージ部分は、インポートされたスキーマ ( http://localhost:8000/service?xsd=xsd0 ) 内のスキーマを参照します。次のことがわかります。

  1. Process2操作 (複合型)の応答のスキーマがProcess2Response空の要素 (つまり、空のシーケンス) です。
  2. Add操作に対する応答のスキーマ( ) は、1 つの要素 (値)AddResponseを含むシーケンスです。xs:int

そのため、プロセッサは(何も返さないため) のメソッドと の非 void メソッドをvoid生成します。Process2Add

于 2011-11-29T19:48:21.513 に答える