WSDLパーサーは、どのようにリクエスト/返信操作のためのvoidメソッドを生成することを決定しますか?

StackOverflow https://stackoverflow.com/questions/8316567

質問

私はこれに5時間を費やしましたが、すでにこの契約第一仕様(「攻撃的な」締め切り、エルゴバカ)を書く30時間を過ごしていますが、私が何が欠けているのかわかりません。

障害があると予想されるので、一方向の操作を望んでいません。私はすでに簡単なWCFサービスを構築しており、それが生成するWSDLとそれを調べました します ボイドメソッドへの往復がありますが、私はそれを非常に長い間見つめていました(そして、WSDL 1.1は最高の時間に非常に迷惑です - 2.0でロールしてください)。

魔法を説明する非常にシンプルなWSDLを提供できますか?このWSDLを使用して、Jax-WS 2.2とWCF 3.5/4.0の両方をターゲットにしています。私はWSDLを手作業で執筆しており、プロキシを構築しようとするたびに(Javaまたは.NET)、常に返されるメッセージを使用してメソッドを構築します。私はそれを失っています。

役に立ちましたか?

解決

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

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

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

アップデート: :タイトルで提起された質問に答えるために、WSDLパーサーは、操作の出力メッセージのスキーマが空である場合、ボイド操作(少なくとも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:操作)入力メッセージのみがあります
  2. 両方 AddProcess2 (R/R操作)入力メッセージと出力メッセージの両方があります

ここで、これらの2操作の出力メッセージのメッセージ部分は、インポートされたスキーマのスキーマを参照しています(で http:// localhost:8000/service?xsd = xsd0)。あなたはそれを見ることができます:

  1. の応答のスキーマ Process2 操作(複雑なタイプ Process2Response)は空の要素です(つまり、空のシーケンス)
  2. の応答のスキーマ Add 手術 (AddResponse)は、1つの要素を含むシーケンスです(an xs:int 価値)。

したがって、プロセッサはaを生成します void の方法 Process2 (何も返さないので) Add.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top