WSDLパーサーは、どのようにリクエスト/返信操作のためのvoidメソッドを生成することを決定しますか?
-
25-10-2019 - |
質問
私はこれに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 あなたはそれを見る:
- 操作
Process1
(WSDLの下:PORTTYPE/WSDL:操作)入力メッセージのみがあります - 両方
Add
とProcess2
(R/R操作)入力メッセージと出力メッセージの両方があります
ここで、これらの2操作の出力メッセージのメッセージ部分は、インポートされたスキーマのスキーマを参照しています(で http:// localhost:8000/service?xsd = xsd0)。あなたはそれを見ることができます:
- の応答のスキーマ
Process2
操作(複雑なタイプProcess2Response
)は空の要素です(つまり、空のシーケンス) - の応答のスキーマ
Add
手術 (AddResponse
)は、1つの要素を含むシーケンスです(anxs:int
価値)。
したがって、プロセッサはaを生成します void
の方法 Process2
(何も返さないので) Add
.