WCFでのContractsの理解

12593 ワード

WCFでのContracts
WCFはContractによってサービスと操作を説明し、一般的に5種類のContract:ServiceContract、OperationContract、FaultContract、DataContract、MessageContractを含む.
 
1.ServiceContract
ServiceContractは、サービス名、ネーミングスペースなどのサーバ側の構成情報を含むサービスインタフェースを外部に漏らす.
   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [OperationContract]
   5:   string MyMethod();
   6:  }
   7:   
   8:  class MyService : IMyContract
   9:  {
  10:   public string MyMethod()
  11:   {
  12:   return "Hello World";
  13:   }
  14:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 
2.OperationContract
OperationContract定義はServiceContractの内部にあり、具体的なサービス操作が定義されています.これに基づいて、オペレーションのトランザクション、バインド(One-way、Two-wayなど)、FaultContract情報を作成できます.
 
   1:   [ServiceContract]
   2:   interface IMyContract
   3:   {
   4:   [FaultContract(typeof(MyFaultContract))]
   5:   [OperationContract]
   6:   string MyMethod();
   7:   }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 
3.Data Contract
サーバとクライアントが対話するコンテンツが定義され、クラスを識別してOperationContractのパラメータまたは戻りタイプとして使用できます.
   1:  [DataContract]
   2:  class Person
   3:  {
   4:   [DataMember]
   5:   public string ID;
   6:   [DataMember]
   7:   public string Name;
   8:  }
   9:   
  10:  [ServiceContract]
  11:  interface IMyContract
  12:  {
  13:   [OperationContract]
  14:   Person GetPerson(int ID);
  15:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 
4.MessageContract
OperationContractでパラメータを渡すか、値を返す必要がある場合は、MessageContractを使用します.メッセージのHeaderやBody、セキュリティなどを定義できます.
   1:  [ServiceContract]
   2:  public interface IRentalService
   3:  {
   4:   [OperationContract]
   5:   double CalPrice(PriceCalculate request);
   6:  }
   7:   
   8:  [MessageContract]
   9:  public class PriceCalculate
  10:  {
  11:   [MessageHeader]
  12:   public MyHeader SoapHeader { get; set; }
  13:   [MessageBodyMember]
  14:   public PriceCal PriceCalculation { get; set; }
  15:  }
  16:   
  17:  [DataContract]
  18:  public class MyHeader
  19:  {
  20:   [DataMember]
  21:   public string UserID { get; set; }
  22:  }
  23:   
  24:  [DataContract]
  25:  public class PriceCal
  26:  {
  27:   [DataMember]
  28:   public DateTime PickupDateTime { get; set; }
  29:   [DataMember]
  30:   public DateTime ReturnDateTime { get; set; }
  31:   [DataMember]
  32:   public string PickupLocation { get; set; }
  33:   [DataMember]
  34:   public string ReturnLocation { get; set; }
  35:   }
  36:   

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 
5.FaultContract
FaultContractは、サービスが発生する可能性のある例外情報と、サービスキューのエラーの処理とエラー情報がクライアントに投げ出される内容を定義します.1つのOperationContactは、0つ以上のFaultContractを含むことができる.
   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [FaultContract(typeof(MyFaultContract1))]
   5:   [FaultContract(typeof(MyFaultContract2))]
   6:   [OperationContract]
   7:   string MyMethod();
   8:   
   9:   [OperationContract]
  10:   string MyShow();
  11:   }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 
MessageContractとDataContractの比較
区別する
DataContractは、NetのCLRタイプは、他のアプリケーションによって識別可能なW 3 CベースXmlの方法にマッピングされ、異なるアプリケーション間でどのようなタイプのデータが使用されているかを考慮する必要がなく、抽象的なXml情報に注目するだけでよい.
MessageContractはSOAPメッセージの構造を記述し,最終的にはサーバとクライアントで伝達されるため,SOAP情報のHeaderとBodiesに直接アクセスして処理することができ,複雑なタイプを処理することができる.
 
MessageContractを使用する理由
MessageContractは、通常、特定のHeader、Footerなどの情報を追加するなど、メッセージボディを直接制御する必要がある場合にのみ使用されます.場合によっては、メッセージにセッション関連の情報を含める必要がある場合、Headerを介して伝達する必要がある場合、メッセージボディに追加のパラメータを追加する必要はありません.あるいは、カスタムのセキュリティプロトコルを提供したり、アプリケーション間でアイデンティティトークンを渡したりする必要があります.
もちろん、MessageContractを使用する場合は、直接シーケンス化して処理するのではなく、SOAPヘッダから情報を取得する必要があります.
 
MessageContractとDataContractを混在させない
1つのOperationContractでは、パラメータと戻り値にそれぞれMessageContractとDataContractを使用しないでください.そうしないと、WSDLの生成時にランタイムエラーが発生します.