「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を参照すると、次のように表示されます。
- 操作
Process1
(wsdl:portType/wsdl:operation の下) には入力メッセージしかありません
- both
Add
and Process2
(r/r operations) には、入力メッセージと出力メッセージの両方があります。
ここで、これら 2 つの操作の出力メッセージのメッセージ部分は、インポートされたスキーマ ( http://localhost:8000/service?xsd=xsd0 ) 内のスキーマを参照します。次のことがわかります。
Process2
操作 (複合型)の応答のスキーマがProcess2Response
空の要素 (つまり、空のシーケンス) です。
Add
操作に対する応答のスキーマ( ) は、1 つの要素 (値)AddResponse
を含むシーケンスです。xs:int
そのため、プロセッサは(何も返さないため) のメソッドと の非 void メソッドをvoid
生成します。Process2
Add