既定のメッセージ コントラクトサンプルは、カスタム ユーザー定義メッセージがサービス操作との間で渡されるサービスを示しています。 このサンプルは、型指定されたサービスとして電卓インターフェイスを実装する 作業の開始 に基づいています。 このサンプルでは、 作業の開始で使用される加算、減算、乗算、除算に対する個々のサービス操作の代わりに、オペランドと演算子の両方を含むカスタム メッセージを渡し、算術計算の結果を返します。
クライアントはコンソール プログラム (.exe) であり、サービス ライブラリ (.dll) はインターネット インフォメーション サービス (IIS) によってホストされます。 クライアント アクティビティはコンソール ウィンドウに表示されます。
注
このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。
サービスでは、 MyMessage
型のカスタム メッセージを受け入れて返す 1 つのサービス操作が定義されます。 このサンプルでは、要求メッセージと応答メッセージの種類は同じですが、必要に応じて異なるメッセージ コントラクトになる可能性があります。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract(Action="http://test/MyMessage_action",
ReplyAction="http://test/MyMessage_action")]
MyMessage Calculate(MyMessage request);
}
カスタム メッセージ MyMessage
は、 MessageContractAttribute、 MessageHeaderAttribute 、および MessageBodyMemberAttribute 属性で注釈が付けられたクラスで定義されます。 このサンプルでは、3 番目のコンストラクターのみを使用します。 メッセージ コントラクトを使用すると、SOAP メッセージを完全に制御できます。 このサンプルでは、 MessageHeaderAttribute 属性を使用して、SOAP ヘッダーに Operation
を配置します。 オペランド N1
、 N2
、および Result
は、 MessageBodyMemberAttribute 属性が適用されているため、SOAP 本文内に表示されます。
[MessageContract]
public class MyMessage
{
private string operation;
private double n1;
private double n2;
private double result;
//Constructor - create an empty message.
public MyMessage() {}
//Constructor - create a message and populate its members.
public MyMessage(double n1, double n2, string operation,
double result)
{
this.n1 = n1;
this.n2 = n2;
this.operation = operation;
this.result = result;
}
//Constructor - create a message from another message.
public MyMessage(MyMessage message)
{
this.n1 = message.n1;
this.n2 = message.n2;
this.operation = message.operation;
this.result = message.result;
}
[MessageHeader]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[MessageBodyMember]
public double N1
{
get { return n1; }
set { n1 = value; }
}
[MessageBodyMember]
public double N2
{
get { return n2; }
set { n2 = value; }
}
[MessageBodyMember]
public double Result
{
get { return result; }
set { result = value; }
}
}
実装クラスには、 Calculate
サービス操作のコードが含まれています。
CalculateService
クラスは、要求メッセージからオペランドと演算子を取得し、次のサンプル コードに示すように、要求された計算の結果を含む応答メッセージを作成します。
// Service class which implements the service contract.
public class CalculatorService : ICalculator
{
// Perform a calculation.
public MyMessage Calculate(MyMessage request)
{
MyMessage response = new MyMessage(request);
switch (request.Operation)
{
case "+":
response.Result = request.N1 + request.N2;
break;
case "-":
response.Result = request.N1 - request.N2;
break;
case "*":
response.Result = request.N1 * request.N2;
break;
case "/":
response.Result = request.N1 / request.N2;
break;
default:
response.Result = 0.0D;
break;
}
return response;
}
}
クライアント用に生成されたクライアント コードは、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) ツールを使用して作成されました。 必要に応じて、生成されたクライアント コードにメッセージ コントラクト型が自動的に作成されます。
/messageContract
コマンド・オプションを指定して、メッセージ・コントラクトの生成を強制することができます。
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
次のサンプル コードは、 MyMessage
メッセージを使用するクライアントを示しています。
// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();
// Perform addition using a typed message.
MyMessage request = new MyMessage()
{
N1 = 100D,
N2 = 15.99D,
Operation = "+"
};
MyMessage response = ((ICalculator)client).Calculate(request);
Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result);
サンプルを実行すると、計算がクライアント コンソール ウィンドウに表示されます。 クライアント ウィンドウで Enter キーを押して、クライアントをシャットダウンします。
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
この時点で、カスタム ユーザー定義メッセージがクライアントとサービス操作の間で渡されました。 メッセージ コントラクトは、オペランドと結果がメッセージ本文にあり、演算子がメッセージ ヘッダーにあることを定義しました。 メッセージ ログは、このメッセージ構造を観察するように構成できます。
サンプルを設定、ビルド、実行するには
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。