開発者の視点から見た ASP.NET Web サービスと WCF との比較Comparing ASP.NET Web Services to WCF Based on Development

Windows Communication Foundation (WCF) では、WCF アプリケーションのプログラミングし、ASP.NET Web サービスのように構成を有効にして、その動作を模倣する ASP.NET 互換性モード オプションがあります。Windows Communication Foundation (WCF) has an ASP.NET compatibility mode option to enable WCF applications to be programmed and configured like ASP.NET Web services, and mimic their behavior. 次のセクションでは、ASP.NET Web サービスの比較され、WCF が両方のテクノロジを使用してアプリケーションの開発に必要なものに基づきます。The following sections compare ASP.NET Web services and WCF based on what is required to develop applications using both technologies.

データ表現Data Representation

ASP.NET で Web サービスを開発する場合、通常はまず、このサービスが使う複合データ型の定義から始めます。The development of a Web service with ASP.NET typically begins with defining any complex data types the service is to use. ASP.NET は XmlSerializer を利用して、.NET Framework 型で表されたデータを XML 形式に変換してサービスとの間でやり取りしたり、XML 形式で受け取ったデータを .NET Framework オブジェクトに変換したりします。ASP.NET relies on the XmlSerializer to translate data represented by .NET Framework types to XML for transmission to or from a service and to translate data received as XML into .NET Framework objects. ASP.NET サービスで使用する複合データ型を定義するには、XmlSerializer で XML 形式にシリアル化したり、XML 形式から逆シリアル化したりできる .NET Framework クラスの定義が必要です。Defining the complex data types that an ASP.NET service is to use requires the definition of .NET Framework classes that the XmlSerializer can serialize to and from XML. クラス定義は手で記述するほか、XML スキーマの型定義から生成することも可能です。それにはコマンド ライン上で実行する XML スキーマ/データ型サポート ユーティリティである xsd.exe を使います。Such classes can be written manually, or generated from definitions of the types in XML Schema using the command-line XML Schemas/Data Types Support Utility, xsd.exe.

XmlSerializer で XML 形式にシリアル化したり、XML 形式から逆シリアル化したりできる .NET Framework クラスを定義する場合に知っておくべき主な事項を次に示します。The following is a list of key issues to know when defining .NET Framework classes that the XmlSerializer can serialize to and from XML:

  • XML に変換されるのは、.NET Framework オブジェクトのパブリック フィールドおよびパブリック プロパティに限ります。Only the public fields and properties of .NET Framework objects are translated into XML.

  • コレクション クラスのインスタンスを XML 形式にシリアル化できるのは、そのクラスが IEnumerable または ICollection インターフェイスを実装している場合に限ります。Instances of collection classes can be serialized into XML only if the classes implement either the IEnumerable or ICollection interface.

  • IDictionary インターフェイスを実装した、Hashtable などのクラスを、XML 形式にシリアル化することはできません。Classes that implement the IDictionary interface, such as Hashtable, cannot be serialized into XML.

  • System.Xml.Serialization 名前空間の属性型は、大部分が .NET Framework クラスやそのメンバーに追加可能であり、これにより、XML での当該クラスのインスタンスの表現方法を制御できます。The great many attribute types in the System.Xml.Serialization namespace can be added to a .NET Framework class and its members to control how instances of the class are represented in XML.

通常、WCF アプリケーションの開発は複合型の定義を含むもが開始します。WCF application development usually also begins with the definition of complex types. WCF は、ASP.NET Web サービスと同じ .NET Framework 型を使用して作成できます。WCF can be made to use the same .NET Framework types as ASP.NET Web services.

WCFDataContractAttributeDataMemberAttribute型のインスタンスを XML、およびどの特定のフィールドまたは型のプロパティをシリアル化する、次のサンプル コードに示すようにシリアル化することを示す .NET Framework 型に追加することができます。The WCFDataContractAttribute and DataMemberAttribute can be added to .NET Framework types to indicate that instances of the type are to be serialized into XML, and which particular fields or properties of the type are to be serialized, as shown in the following sample code.

//Example One:
[DataContract]
public class LineItem
{
    [DataMember]
    public string ItemNumber;
    [DataMember]
    public decimal Quantity;
    [DataMember]
    public decimal UnitPrice;
}

//Example Two:
public class LineItem
{
    [DataMember]
    private string itemNumber;
    [DataMember]
    private decimal quantity;
    [DataMember]
    private decimal unitPrice;

    public string ItemNumber
    {
      get
      {
          return this.itemNumber;
      }

      set
      {
          this.itemNumber = value;
      }
    }

    public decimal Quantity
    {
        get
        {
            return this.quantity;
        }

        set
        {
            this.quantity = value;
        }
    }

    public decimal UnitPrice
    {
      get
      {
          return this.unitPrice;
      }

      set
      {
          this.unitPrice = value;
      }
    }
}

//Example Three:
public class LineItem
{
     private string itemNumber;
     private decimal quantity;
     private decimal unitPrice;

     [DataMember]
     public string ItemNumber
     {
       get
       {
          return this.itemNumber;
       }

       set
       {
           this.itemNumber = value;
       }
     }

     [DataMember]
     public decimal Quantity
     {
          get
          {
              return this.quantity;
          }

          set
          {
             this.quantity = value;
          }
     }

     [DataMember]
     public decimal UnitPrice
     {
          get
          {
              return this.unitPrice;
          }

          set
          {
              this.unitPrice = value;
          }
     }
}

DataContractAttribute は、当該型の中にシリアル化可能なフィールドやプロパティがあることを示し、具体的にどのフィールドやプロパティをシリアル化できるかを DataMemberAttribute で示します。The DataContractAttribute signifies that zero or more of a type’s fields or properties are to be serialized, while the DataMemberAttribute indicates that a particular field or property is to be serialized. DataContractAttribute はクラスにも構造体にも適用できます。The DataContractAttribute can be applied to a class or structure. DataMemberAttribute はフィールドやプロパティに適用します。これはパブリックでもプライベートでもかまいません。The DataMemberAttribute can be applied to a field or a property, and the fields and properties to which the attribute is applied can be either public or private. 型のインスタンス、DataContractAttributeに適用されるにと呼ばれる WCF でのデータ コントラクトします。Instances of types that have the DataContractAttribute applied to them are referred to as data contracts in WCF. これを XML 形式にシリアル化するには DataContractSerializer を使います。They are serialized into XML using DataContractSerializer.

DataContractSerializer を使う場合と、XmlSerializer および System.Xml.Serialization 名前空間に定義された属性を使う場合の、主な違いを以下に示します。The following is a list of the important differences between using the DataContractSerializer and using the XmlSerializer and the various attributes of the System.Xml.Serialization namespace.

  • XmlSerializerSystem.Xml.Serialization 名前空間の属性は、XML スキーマで定義された有効な型であればどれにでも .NET Framework 型をマップできるようにするためのものです。これらを使うと、XML での型の表現方法を細かく制御できます。The XmlSerializer and the attributes of the System.Xml.Serialization namespace are designed to allow you to map .NET Framework types to any valid type defined in XML Schema, and so they provide for very precise control over how a type is represented in XML. これに対し、DataContractSerializerDataContractAttribute、および DataMemberAttribute の場合、XML での型の表現方法にはほとんど自由度がありません。The DataContractSerializer, DataContractAttribute and DataMemberAttribute provide very little control over how a type is represented in XML. 指定できるのは、名前空間と、型やフィールド、プロパティを XML で表す名前、フィールドやプロパティの XML における並び順だけです。You can only specify the namespaces and names used to represent the type and its fields or properties in the XML, and the sequence in which the fields and properties appear in the XML:

    [DataContract(
    Namespace="urn:Contoso:2006:January:29",
    Name="LineItem")]
    public class LineItem
    {
          [DataMember(Name="ItemNumber",IsRequired=true,Order=0)]
          public string itemNumber;
          [DataMember(Name="Quantity",IsRequired=false,Order = 1)]
          public decimal quantity;
          [DataMember(Name="Price",IsRequired=false,Order = 2)]
          public decimal unitPrice;
    }
    

    上記以外の事項は、DataContractSerializer に固定で組み込まれています。Everything else about the structure of the XML used to represent the .NET type is determined by the DataContractSerializer.

  • DataContractSerializer の場合、型の XML での表現方法に自由度が小さく、したがってシリアル化のプロセスがあらかじめ大部分予測できるので、最適化が容易です。By not permitting much control over how a type is to be represented in XML, the serialization process becomes highly predictable for the DataContractSerializer, and, thereby, easier to optimize. DataContractSerializer を使えば、性能が約 10% 向上するという現実的な利点があります。A practical benefit of the design of the DataContractSerializer is better performance, approximately ten percent better performance.

  • XmlSerializer を使用する方法では、どのフィールドやプロパティを XML にシリアル化するかを属性で指定することはできませんが、DataMemberAttribute の場合は DataContractSerializer 属性で明示的に指定できます。The attributes for use with the XmlSerializer do not indicate which fields or properties of the type are serialized into XML, whereas the DataMemberAttribute for use with the DataContractSerializer shows explicitly which fields or properties are serialized. このように、データ コントラクトとは、アプリケーションとの間でやり取りするデータ構造を明示した契約であると言うことができます。Therefore, data contracts are explicit contracts about the structure of the data that an application is to send and receive.

  • XmlSerializer で XML 形式に変換できるのは、.NET オブジェクトのパブリック メンバーに限ります。一方 DataContractSerializer は、アクセス修飾子にかかわらず、どのメンバーでも変換可能です。The XmlSerializer can only translate the public members of a .NET object into XML, the DataContractSerializer can translate the members of objects into XML regardless of the access modifiers of those members.

  • DataContractSerializer の場合、パブリックでないメンバーも XML に変換できるため、シリアル化できる .NET 型についての制約が少なくなります。As a consequence of being able to serialize the non-public members of types into XML, the DataContractSerializer has fewer restrictions on the variety of .NET types that it can serialize into XML. 特に、Hashtable など、IDictionary インターフェイスを実装した型が変換可能です。In particular, it can translate into XML types like Hashtable that implement the IDictionary interface. DataContractSerializer はさらに、既存の .NET 型のインスタンスを XML にシリアル化する場合でも、型定義を変更したり、ラッパーを定義したりする必要がありません。The DataContractSerializer is much more likely to be able to serialize the instances of any pre-existing .NET type into XML without having to either modify the definition of the type or develop a wrapper for it.

  • DataContractSerializer はパブリックでないメンバーも変換できるため、完全に信頼できるコードからしか実行できないようになっています。XmlSerializer にはそのような制約がありません。Another consequence of the DataContractSerializer being able to access the non-public members of a type is that it requires full trust, whereas the XmlSerializer does not. コードの完全な信頼アクセス許可は、コードが実行されている資格情報を使用してアクセスできるコンピューター上のすべてのリソースへの完全なアクセスを示します。The Full Trust code access permission gives complete access to all resources on a machine that can be accessed using the credentials under which the code is executing. このオプションは、完全に信頼されたコード、コンピューター上のすべてのリソースにアクセスするように注意して使用する必要があります。This option should be used with care as fully trusted code accesses all resources on your machine.

  • DataContractSerializer にはバージョン管理の機能がいくつか組み込まれています。The DataContractSerializer incorporates some support for versioning:

    • DataMemberAttribute には IsRequired プロパティがあります。旧バージョンにはなかったメンバーを追加した場合に、そのプロパティを false とすれば、当該データ コントラクトの新バージョンを扱うアプリケーションが、旧バージョンのデータも扱えるようになります。The DataMemberAttribute has an IsRequired property that can be assigned a value of false for members that are added to new versions of a data contract that were not present in earlier versions, thereby allowing applications with the newer version of the contract to be able to process earlier versions.

    • データ コントラクトに IExtensibleDataObject インターフェイスを実装すると、DataContractSerializer は、新バージョンのデータ コントラクトで定義されたメンバーを、旧バージョンのコントラクトを扱うアプリケーション経由で受け渡しできるようになります。By having a data contract implement the IExtensibleDataObject interface, one can allow the DataContractSerializer to pass members defined in newer versions of a data contract through applications with earlier versions of the contract.

以上のようにさまざまな違いがありますが、XmlSerializer で既定の設定を使用して型をシリアル化したものは、XML の名前空間を明示的に定義してあれば、DataContractSerializer で型をシリアル化したものと意味的に同等です。Despite all of the differences, the XML into which the XmlSerializer serializes a type by default is semantically identical to the XML into which the DataContractSerializer serializes a type, provided the namespace for the XML is explicitly defined. シリアライザーの両方で使用するための属性を持ち、次のクラスは、意味的に同一の XML に変換されます、XmlSerializerおよび、 DataContractAttribute:The following class, which has attributes for use with both of the serializers, is translated into semantically identical XML by the XmlSerializer and by the DataContractAttribute:

[Serializable]
[XmlRoot(Namespace="urn:Contoso:2006:January:29")]
[DataContract(Namespace="urn:Contoso:2006:January:29")]
public class LineItem
{
     [DataMember]
     public string ItemNumber;
     [DataMember]
     public decimal Quantity;
     [DataMember]
     public decimal UnitPrice;
}

Windows ソフトウェア開発キット (SDK) と呼ばれるコマンド ライン ツールが含まれています、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)します。The Windows software development kit (SDK) includes a command-line tool called the ServiceModel Metadata Utility Tool (Svcutil.exe). などの xsd.exe ツールは、ASP.NET Web サービスで使用される、Svcutil.exe は、XML スキーマから .NET データ型の定義を生成できます。Like the xsd.exe tool used with ASP.NET Web services, Svcutil.exe can generate definitions of .NET data types from XML Schema. DataContractSerializer が XML スキーマで定義された形式の XML を出力できる場合、型はデータ コントラクトの形に変換されます。そうでなければ、XmlSerializer を使用してシリアル化します。The types are data contracts if the DataContractSerializer can emit XML in the format defined by the XML Schema; otherwise, they are intended for serialization using the XmlSerializer. Svcutil.exe を使用してデータ コントラクトから XML スキーマも生成できるそのdataContractOnlyスイッチします。Svcutil.exe can also generate an XML schema from data contracts by using its dataContractOnly switch.

注意

ASP.NET Web サービスの使用、 XmlSerializer、および WCF の ASP.NET 互換モードは、ASP.NET Web サービスの動作を模倣する WCF サービス、ASP.NET 互換性オプションも使用する 1 つは制限されません、XmlSerializerします。Although ASP.NET Web services use the XmlSerializer, and WCF ASP.NET compatibility mode makes WCF services mimic the behavior of ASP.NET Web services, the ASP.NET compatibility option does not restrict one to using the XmlSerializer. 必要であれば ASP.NET 互換モードでも DataContractSerializer も使えるようになっています。One can still use the DataContractSerializer with services running in the ASP.NET compatibility mode.

サービスの開発Service Development

ASP.NET を使用してサービスを開発する場合、通常は WebService 属性をクラスに追加し、WebMethodAttribute を当該クラスのサービスに対する操作メソッドに追加します。To develop a service using ASP.NET, it has been customary to add the WebService attribute to a class, and the WebMethodAttribute to any of that class’ methods that are to be operations of the service:

[WebService]
public class Service : T:System.Web.Services.WebService
{
    [WebMethod]
    public string Echo(string input)
    {
       return input;
    }
}

ASP.NET 2.0 では、WebService 属性や WebMethodAttribute 属性をクラスではなくインターフェイスに追加し、そのインターフェイスを実装するクラスを記述する、という方法も使えるようになりました。ASP.NET 2.0 introduced the option of adding the attribute WebService and WebMethodAttribute to an interface rather than to a class, and writing a class to implement the interface:

[WebService]
public interface IEcho
{
    [WebMethod]
    string Echo(string input);
}

public class Service : IEcho
{

   public string Echo(string input)
   {
        return input;
    }
}

WebService 属性を持つインターフェイスは、サービスによって実行される操作のコントラクトを構成し、またそれをさまざまなクラスで再利用することによって、同じコントラクトをさまざまな方法で実装できるので、このオプションの使用をお勧めします。Using this option is to be preferred, because the interface with the WebService attribute constitutes a contract for the operations performed by the service that can be reused with various classes that might implement that same contract in different ways.

WCF サービスは、1 つまたは複数の WCF エンドポイントの定義によって提供されます。A WCF service is provided by defining one or more WCF endpoints. エンドポイントは、アドレス、バインディング、サービス コントラクトで定義します。An endpoint is defined by an address, a binding and a service contract. アドレスとは、サービスが配備された場所のことです。The address defines where the service is located. バインディングはサービスとの通信方法を表します。The binding specifies how to communicate with the service. サービス コントラクトとは、サービスが実行できる操作の定義のことです。The service contract defines the operations that the service can perform.

サービス コントラクトは通常、インターフェイスに ServiceContractAttribute および OperationContractAttribute を追加して定義します。The service contract is usually defined first, by adding ServiceContractAttribute and OperationContractAttribute to an interface:

[ServiceContract]
public interface IEcho
{
     [OperationContract]
     string Echo(string input);
}

ServiceContractAttributeインターフェイスは、WCF サービス コントラクトを定義することを指定します、 OperationContractAttribute 、あれば、インターフェイスのメソッドの定義するサービス コントラクトの操作を示します。The ServiceContractAttribute specifies that the interface defines a WCF service contract, and the OperationContractAttribute indicates which, if any, of the methods of the interface define operations of the service contract.

このようにして定義されたサービス コントラクトをクラスとして実装します。サービス コントラクトを定義するインターフェイスを実装するクラスという形で記述します。Once a service contract has been defined, it is implemented in a class, by having the class implement the interface by which the service contract is defined:

public class Service : IEcho
{
    public string Echo(string input)
    {
       return input;
    }
}

サービス コントラクトを実装するクラスは、WCF での入力をサービスとして参照されます。A class that implements a service contract is referred to as a service type in WCF.

次に、アドレスとバインディングを、サービス型と関連付けます。The next step is to associate an address and a binding with a service type. 通常、直接、ファイルを編集して、または WCF で提供される構成エディターを使用して、構成ファイルで行われます。That is typically done in a configuration file, either by editing the file directly, or by using a configuration editor provided with WCF. 構成ファイルの例を以下に示します。Here is an example of a configuration file.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
     <system.serviceModel>
      <services>
      <service name="Service ">
       <endpoint
        address="EchoService"
        binding="basicHttpBinding"
        contract="IEchoService "/>
      </service>
      </services>
     </system.serviceModel>
</configuration>

バインディングは、アプリケーションとの通信に使う一連のプロトコルを表します。The binding specifies the set of protocols for communicating with the application. 一般的なシステム指定のバインディングを以下に示します。The following table lists the system-provided bindings that represent common options.

名前Name 目的Purpose
BasicHttpBindingBasicHttpBinding WS-BasicProfile 1.1 および Basic Security Profile 1.0 に対応した Web サービスやクライアントとの相互運用性。Interoperability with Web services and clients supporting the WS-BasicProfile 1.1 and Basic Security Profile 1.0.
WSHttpBindingWSHttpBinding HTTP 上の WS-* プロトコルに対応した Web サービスやクライアントとの相互運用性。Interoperability with Web services and clients that support the WS-* protocols over HTTP.
WSDualHttpBindingWSDualHttpBinding 双方向 HTTP 通信。最初のメッセージの受信者は送信元に直接は応答せず、代わりに、WS-* プロトコルに準拠した HTTP で、ある期間にわたって任意の数の応答を送信することができます。Duplex HTTP communication, by which the receiver of an initial message does not reply directly to the initial sender, but may transmit any number of responses over a period of time by using HTTP in conformity with WS-* protocols.
WSFederationBindingWSFederationBinding HTTP 通信。サービスのリソースに対するアクセスを、明示的に指定された資格情報プロバイダーによって発行された証明書に基づいて制御することができます。HTTP communication, in which access to the resources of a service can be controlled based on credentials issued by an explicitly-identified credential provider.
NetTcpBindingNetTcpBinding ネットワーク経由で WCF ソフトウェア エンティティ間の通信のセキュリティで保護された、信頼性の高い、高パフォーマンスSecure, reliable, high-performance communication between WCF software entities across a network.
NetNamedPipeBindingNetNamedPipeBinding 同じコンピューターに WCF ソフトウェア エンティティ間の通信のセキュリティで保護された、信頼性の高い、高パフォーマンスSecure, reliable, high-performance communication between WCF software entities on the same machine.
NetMsmqBindingNetMsmqBinding MSMQ を使用して WCF ソフトウェア エンティティ間の通信。Communication between WCF software entities by using MSMQ.
MsmqIntegrationBindingMsmqIntegrationBinding WCF のソフトウェア エンティティと MSMQ を使用して別のソフトウェア エンティティ間の通信。Communication between a WCF software entity and another software entity by using MSMQ.
NetPeerTcpBindingNetPeerTcpBinding Windows ピア ツー ピア ネットワー キングを使用して WCF ソフトウェア エンティティ間の通信。Communication between WCF software entities by using Windows Peer-to-Peer Networking.

システム指定のバインディングである BasicHttpBinding には、ASP.NET Web サービスが対応している一連のプロトコルが組み込まれています。The system-provided binding, BasicHttpBinding, incorporates the set of protocols supported by ASP.NET Web services.

WCF アプリケーションのカスタム バインドは、WCF を使用して個々 のプロトコルを実装するバインド要素クラスのコレクションとして簡単に定義されます。Custom bindings for WCF applications are easily defined as collections of the binding element classes that WCF uses to implement individual protocols. 追加のプロトコルを表す、新しいバインド要素を記述することも可能です。New binding elements can be written to represent additional protocols.

サービス型の内部的な動作は、動作を表すクラス群のプロパティで調整できます。The internal behavior of service types can be adjusted using the properties of a family of classes called behaviors. 次の例で、ServiceBehaviorAttribute クラスは、サービス型がマルチスレッド処理されることを指定しています。Here, the ServiceBehaviorAttribute class is used to specify that the service type is to be multithreaded.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple]
public class DerivativesCalculatorServiceType: IDerivativesCalculator

ServiceBehaviorAttribute など、属性として定義された動作もあります。Some behaviors, like ServiceBehaviorAttribute, are attributes. これに対し、管理者がプロパティを設定できる動作は、アプリケーションの構成ファイルで変更することができます。Others, the ones with properties that administrators would want to set, can be modified in the configuration of an application.

サービス型のプログラムの記述には、多くの場合 OperationContext クラスを使います。In programming service types, frequent use is made of the OperationContext class. 静的プロパティである Current を介して、実行コンテキストに関する情報にアクセスできます。Its static Current property provides access to information about the context in which an operation is running. OperationContext の使い方は、HttpContext クラスや ContextUtil クラスと同様です。OperationContext is similar to both the HttpContext and ContextUtil classes.

ホストHosting

ASP.NET Web サービスは、コンパイルしてクラス ライブラリ アセンブリの形になっています。ASP.NET Web services are compiled into a class library assembly. サービス ファイルという、拡張子が .asmx のファイルの @ WebService ディレクティブに、サービスの実行コードが組み込まれたクラスと、これを収容するアセンブリが定義されています。A file called the service file is provided that has the extension .asmx and contains an @ WebService directive that identifies the class that contains the code for the service and the assembly in which it is located.

<%@ WebService Language="C#" Class="Service,ServiceAssembly" %>

サービス ファイルをインターネット インフォメーション サービス (IIS) の ASP.NET アプリケーション ルート、アセンブリをアプリケーション ルートのサブディレクトリ \bin 以下にコピーすると、The service file is copied into an ASP.NET application root in Internet Information Services (IIS), and the assembly is copied into the \bin subdirectory of that application root. このサービス ファイルの URL (Uniform Resource Locator) でアプリケーションにアクセスできるようになります。The application is then accessible by using the uniform resource locator (URL) of the service file in the application root.

および任意の .NET アプリケーション内で IIS 5.1 または 6.0 では、Windows プロセス アクティブ化サービス (WAS) IIS 7.0 の一部として提供されている WCF サービスをホストに容易にできます。WCF services can readily be hosted within IIS 5.1 or 6.0, the Windows Process Activation Service (WAS) that is provided as part of IIS 7.0, and within any .NET application. ただし IIS 5.1/6.0 の場合、通信トランスポート プロトコルは HTTP に限ります。To host a service in IIS 5.1 or 6.0, the service must use HTTP as the communications transport protocol.

IIS 5.1/6.0 または WAS 上でサービスをホストする手順を以下に示します。To host a service within IIS 5.1, 6.0 or within WAS, use the follows steps:

  1. サービス型をコンパイルしてクラス ライブラリ アセンブリを生成します。Compile the service type into a class library assembly.

  2. 拡張子を .svc としたサービス ファイルを作り、サービス型を @ ServiceHost ディレクティブで次のように指定します。Create a service file with a .svc extension with an @ ServiceHost directive to identify the service type:

    <%@ServiceHost language="c#" Service="MyService" %>
    
  3. サービス ファイルを仮想ディレクトリにコピーし、アセンブリをその仮想ディレクトリの \bin サブディレクトリにコピーします。Copy the service file into a virtual directory, and the assembly into the \bin subdirectory of that virtual directory.

  4. 構成ファイルを仮想ディレクトリに、Web.config という名前でコピーします。Copy the configuration file into the virtual directory, and name it Web.config.

するとアプリケーションには、アプリケーション ルートに置いたサービス ファイルの URL でアクセスできるようになります。The application is then accessible by using the URL of the service file in the application root.

.NET アプリケーション内で WCF サービスをホストするサービス型、アプリケーションによって参照されるクラス ライブラリ アセンブリをコンパイルし、サービスを使用して、ホストにアプリケーションをプログラミング、ServiceHostクラス。To host a WCF service within a .NET application, compile the service type into a class library assembly referenced by the application, and program the application to host the service using the ServiceHost class. サービスを管理する基本的なプログラムの例を以下に示します。The following is an example of the basic programming required:

string httpBaseAddress = "http://www.contoso.com:8000/";
string tcpBaseAddress = "net.tcp://www.contoso.com:8080/";

Uri httpBaseAddressUri = new Uri(httpBaseAddress);
Uri tcpBaseAddressUri = new Uri(tcpBaseAddress);

Uri[] baseAddresses = new Uri[] {
 httpBaseAddressUri,
 tcpBaseAddressUri};

using(ServiceHost host = new ServiceHost(
typeof(Service), //"Service" is the name of the service type baseAddresses))
{
     host.Open();

     […] //Wait to receive messages
     host.Close();
}

この例では ServiceHost の構築時にトランスポート プロトコルに対してアドレスを指定しています。This example shows how addresses for one or more transport protocols are specified in the construction of a ServiceHost. このアドレスをベース アドレスと呼びます。These addresses are referred to as base addresses.

WCF サービスのエンドポイントに指定されたアドレスは、エンドポイントのホストのベース アドレスに対する相対アドレスです。The address provided for any endpoint of a WCF service is an address relative to a base address of the endpoint’s host. ホストではトランスポート プロトコルごとに 1 つベース アドレスを設定できます。The host can have one base address for each communication transport protocol. 上記の構成ファイルの構成例では、エンドポイントに対して選択された BasicHttpBinding はトランスポート プロトコルとして HTTP を使用しているので、エンドポイント EchoService のアドレスは、HTTP に対して設定されたベース アドレスを基準としたものになります。In the sample configuration in the preceding configuration file, the BasicHttpBinding selected for the endpoint uses HTTP as the transport protocol, so the address of the endpoint, EchoService, is relative to the host’s HTTP base address. 上記の例では、ホストの場合、HTTP ベース アドレスはhttp://www.contoso.com:8000/します。In the case of the host in the preceding example, the HTTP base address is http://www.contoso.com:8000/. なお、IIS や WAS 上でホストされているサービスの場合、ベース アドレスはサービス ファイルの URL になります。For a service hosted within IIS or WAS, the base address is the URL of the service’s service file.

WCF の ASP.NET 互換モード オプションを使用する IIS または WAS とする構成と HTTP トランスポート プロトコルとして排他的でホストされているサービスのみが可能です。Only services hosted in IIS or WAS, and which are configured with HTTP as the transport protocol exclusively, can be made to use WCF ASP.NET compatibility mode option. ASP.NET 互換モードは、次の 2 つの手順で切り替えます。Turning that option on requires the following steps.

  1. プログラムの開発者は、サービス型に AspNetCompatibilityRequirementsAttribute 属性を追加し、ASP.NET 互換モードに切り替えることができる、または切り替えることが必須である旨の指定をしておく必要があります。The programmer must add the AspNetCompatibilityRequirementsAttribute attribute to the service type and specify that ASP.NET compatibility mode is either allowed or required.

    [System.ServiceModel.Activation.AspNetCompatibilityRequirements(
          RequirementsMode=AspNetCompatibilityRequirementsMode.Require)]
    public class DerivativesCalculatorServiceType: IDerivativesCalculator
    
  2. 管理者は、アプリケーションが ASP.NET 互換モードで動作するよう、次のように構成する必要があります。The administrator must configure the application to use the ASP.NET compatibility mode.

    <configuration>
         <system.serviceModel>
          <services>
          […]
          </services>
          <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
        </system.serviceModel>
    </configuration>
    

    WCF アプリケーションを構成すると、.svc ではなく、サービス ファイルの拡張機能として .asmx を使用することもできます。WCF applications can also be configured to use .asmx as the extension for their service files rather than .svc.

    <system.web>
         <compilation>
          <compilation debug="true">
          <buildProviders>
           <remove extension=".asmx"/>
           <add extension=".asmx"
            type="System.ServiceModel.ServiceBuildProvider,
            System.ServiceModel,
            Version=3.0.0.0,
            Culture=neutral,
            PublicKeyToken=b77a5c561934e089" />
          </buildProviders>
          </compilation>
         </compilation>
    </system.web>
    

    オプションでは、WCF を使用するサービスを変更する場合に .asmx サービス ファイルの Url を使用するように構成されたクライアントを変更することから保存できます。That option can save you from having to modify clients that are configured to use the URLs of .asmx service files when modifying a service to use WCF.

クライアント開発Client Development

ASP.NET Web サービスのクライアントの開発にはコマンド ライン ツール WSDL.exe を使用します.asmx ファイルの URL を入力として指定します。Clients for ASP.NET Web services are generated using the command-line tool, WSDL.exe, which provides the URL of the .asmx file as input. WCF に用意された、対応するツールがServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)します。The corresponding tool provided by WCF is ServiceModel Metadata Utility Tool (Svcutil.exe). サービス コントラクトの定義と WCF クライアント クラスの定義を持つコード モジュールを生成します。It generates a code module with the definition of the service contract and the definition of a WCF client class. また、サービスのアドレスとバインディングを指定して、構成ファイルを生成することもできます。It also generates a configuration file with the address and binding of the service.

リモート サービスのクライアントを開発する場合、通常は、非同期パターンに従ってプログラムを記述するようお勧めします。In programming a client of a remote service it is generally advisable to program according to an asynchronous pattern. WSDL.exe ツールは、特段の指定をしなくても、同期パターンと非同期パターンを使ったコードをそれぞれ生成します。The code generated by the WSDL.exe tool always provides for both a synchronous and an asynchronous pattern by default. によって生成されたコード、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)のいずれかのパターンを指定できます。The code generated by the ServiceModel Metadata Utility Tool (Svcutil.exe) can provide for either pattern. 特に指定しなければ同期パターン用です。It provides for the synchronous pattern by default. /async スイッチを指定して実行すれば、生成されるコードは非同期パターン用になります。If the tool is executed with the /async switch, then the generated code provides for the asynchronous pattern.

ASP によって生成された WCF クライアント クラスの名前を示す保証はありません。NET の WSDL.exe ツールでは、既定では、Svcutil.exe ツールによって生成された WCF クライアント クラスの名前と一致します。There is no guarantee that names in the WCF client classes generated by ASP.NET’s WSDL.exe tool, by default, match the names in WCF client classes generated by the Svcutil.exe tool. 特に、XmlSerializer でシリアル化したクラスのプロパティ名は、Svcutil.exe で生成した場合 "Property" という接頭辞が付きますが、WSDL.exe の場合はそうなりません。In particular, the names of the properties of classes that have to be serialized using the XmlSerializer are, by default, given the suffix Property in the code generated by the Svcutil.exe tool, which is not the case with the WSDL.exe tool.

メッセージ表現Message Representation

ASP.NET Web サービスとやり取りする SOAP メッセージのヘッダーはカスタマイズ可能です。The headers of the SOAP messages sent and received by ASP.NET Web services can be customized. SoapHeader の派生クラスでヘッダーの構造を定義し、SoapHeaderAttribute でヘッダーが存在することを指定します。A class is derived from SoapHeader to define the structure of the header, and then the SoapHeaderAttribute is used to indicate the presence of the header.

public class SomeProtocol : SoapHeader
{
     public long CurrentValue;
     public long Total;
}

[WebService]
public interface IEcho
{
     SomeProtocol ProtocolHeader
     {
      get;
     set;
     }

     [WebMethod]
     [SoapHeader("ProtocolHeader")]
     string PlaceOrders(PurchaseOrderType order);
}

public class Service: WebService, IEcho
{
     private SomeProtocol protocolHeader;

     public SomeProtocol ProtocolHeader
     {
         get
         {
              return this.protocolHeader;
         }

         set
         {
              this.protocolHeader = value;
         }
     }

     string PlaceOrders(PurchaseOrderType order)
     {
         long currentValue = this.protocolHeader.CurrentValue;
     }
}

WCF は、属性を提供MessageContractAttributeMessageHeaderAttributeMessageBodyMemberAttributeサービスによって送受信される SOAP メッセージの構造を記述します。The WCF provides the attributes, MessageContractAttribute, MessageHeaderAttribute, and MessageBodyMemberAttribute to describe the structure of the SOAP messages sent and received by a service.

[DataContract]
public class SomeProtocol
{
     [DataMember]
     public long CurrentValue;
     [DataMember]
     public long Total;
}

[DataContract]
public class Item
{
     [DataMember]
     public string ItemNumber;
     [DataMember]
     public decimal Quantity;
     [DataMember]
     public decimal UnitPrice;
}

[MessageContract]
public class ItemMessage
{
     [MessageHeader]
     public SomeProtocol ProtocolHeader;
     [MessageBody]
     public Item Content;
}

[ServiceContract]
public interface IItemService
{
     [OperationContract]
     public void DeliverItem(ItemMessage itemMessage);
}

この構文でメッセージ構造を明示的に記述できますが、ASP.NET Web サービスのコードからメッセージ構造を導くことも可能です。This syntax yields an explicit representation of the structure of the messages, whereas the structure of messages is implied by the code of an ASP.NET Web service. また、ASP.NET の構文ではメッセージ ヘッダーとして表されます、サービスのプロパティなど、ProtocolHeader前の例では、プロパティが WCF の構文ではメッセージのプロパティとしてより正確に表されます。Also, in the ASP.NET syntax, message headers are represented as properties of the service, such as the ProtocolHeader property in the previous example, whereas in WCF syntax, they are more accurately represented as properties of messages. また、WCF では、エンドポイントの構成に追加するメッセージ ヘッダーができます。Also, WCF allows message headers to be added to the configuration of endpoints.

<service name="Service ">
     <endpoint
      address="EchoService"
      binding="basicHttpBinding"
      contract="IEchoService ">
      <headers>
      <dsig:X509Certificate
       xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
       ...
      </dsig:X509Certificate>
      </headers>
     </endpoint>
</service>

この方法では、クライアントやサービスのコード内で、基盤となるプロトコル ヘッダーを参照しなくても済みます。エンドポイントが適切に構成されているので、ヘッダーがメッセージ中に取り込まれるからです。That option allows you to avoid any reference to infrastructural protocol headers in the code for a client or service: the headers are added to messages because of how the endpoint is configured.

サービスの説明Service Description

WSDL で記述したクエリを HTTP GET 要求として発行して、ASP.NET Web サービスの .asmx ファイルを取得しようとすると、ASP.NET は WSDL によるサービス記述を生成し、Issuing an HTTP GET request for the .asmx file of an ASP.NET Web service with the query WSDL causes ASP.NET to generate WSDL to describe the service. 要求に対する応答として返します。It returns that WSDL as the response to the request.

ASP.NET 2.0 では、サービスが Web Services-Interoperability Organization (WS-I) の Basic Profile 1.1 に準拠していることを検証し、その旨を WSDL による記述に追加できるようになりました。ASP.NET 2.0 made it possible to validate that a service is compliant with the Basic Profile 1.1 of the Web Services-Interoperability Organization (WS-I), and to insert a claim that the service is compliant into its WSDL. この処理には、ConformsTo 属性の EmitConformanceClaims および WebServiceBindingAttribute パラメーターを使用します。That is done using the ConformsTo and EmitConformanceClaims parameters of the WebServiceBindingAttribute attribute.

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(
     ConformsTo = WsiProfiles.BasicProfile1_1,
     EmitConformanceClaims=true)]
public interface IEcho

ASP.NET が WSDL で生成したサービス記述はカスタマイズ可能です。The WSDL that ASP.NET generates for a service can be customized. ServiceDescriptionFormatExtension の派生クラスを作成し、WSDL による記述に項目を追加する、という形でカスタマイズします。Customizations are made by creating a derived class of ServiceDescriptionFormatExtension to add items to the WSDL.

WCF でサービスを記述する WSDL 応答は、IIS 51 内でホストされている HTTP エンドポイントを持つクエリは、WSDL、WCF サービスの .svc ファイルの HTTP GET 要求を発行する 6.0 または WAS から発生します。Issuing an HTTP GET request with the query WSDL for the .svc file of a WCF service with an HTTP endpoint hosted within IIS 51, 6.0 or WAS causes WCF to respond with WSDL to describe the service. httpGetEnabled が true に設定されている場合は、WSDL で記述したクエリを HTTP GET 要求として、.NET アプリケーション上でホストされているサービスの HTTP ベース アドレスに発行しても同じ効力があります。Issuing an HTTP GET request with the query WSDL to the HTTP base address of a service hosted within a .NET application has the same effect if httpGetEnabled is set to true.

ただし、WCF は、サービスの記述を生成すると、WSDL での Ws-metadataexchange 要求にも応答します。However, WCF also responds to WS-MetadataExchange requests with WSDL that it generates to describe a service. ASP.NET Web サービスには、WS-MetadataExchange 要求に応答する機能がありません。ASP.NET Web services do not have built-in support for WS-MetadataExchange requests.

WCF によって生成される WSDL を広範囲にカスタマイズできます。The WSDL that WCF generates can be extensively customized. ServiceMetadataBehavior クラスには、WSDL による記述をカスタマイズするための機能がいくつか組み込まれています。The ServiceMetadataBehavior class provides some facilities for customizing the WSDL. WSDL を生成しませんが、静的な WSDL ファイルを使用して、特定の url にではなく、WCF を構成することもできます。The WCF can also be configured to not generate WSDL, but rather to use a static WSDL file at a given URL.

<behaviors>
     <behavior name="DescriptionBehavior">
     <metadataPublishing
      enableMetadataExchange="true"
      enableGetWsdl="true"
      enableHelpPage="true"
      metadataLocation=
      "http://localhost/DerivativesCalculatorService/Service.WSDL"/>
     </behavior>
</behaviors>

例外処理Exception Handling

ASP.NET Web サービスでは、処理できない例外が発生すると、SOAP エラーとしてクライアントに返されます。In ASP.NET Web services, unhandled exceptions are returned to clients as SOAP faults. また、SoapException クラスのインスタンスを明示的にスローして、クライアント側に SOAP エラーの詳しい状況を通知し、より適切に管理させることも可能です。You can also explicitly throw instances of the SoapException class and have more control over the content of the SOAP fault that gets transmitted to the client.

WCF サービスで未処理の例外は返されませんをクライアントに機密情報が、例外を誤って公開されることを防ぐために SOAP エラーとして。In WCF services, unhandled exceptions are not returned to clients as SOAP faults to prevent sensitive information being inadvertently exposed through the exceptions. ただしデバッグ目的で、このような例外をクライアントに返すように設定することは可能です。A configuration setting is provided to have unhandled exceptions returned to clients for the purpose of debugging.

SOAP エラーをクライアントに返す場合、データ コントラクト型を汎用型 FaultException<TDetail> のインスタンスとしてキャストし、これをスローする方法が使えます。To return SOAP faults to clients, you can throw instances of the generic type, FaultException<TDetail>, using the data contract type as the generic type. また、操作に FaultContractAttribute 属性を追加して、操作で生じうるエラーを指定する方法もあります。You can also add FaultContractAttribute attributes to operations to specify the faults that an operation might yield.

[DataContract]
public class MathFault
{
     [DataMember]
     public string operation;
     [DataMember]
     public string problemType;
}

[ServiceContract]
public interface ICalculator
{
     [OperationContract]
     [FaultContract(typeof(MathFault))]
     int Divide(int n1, int n2);
}

これにより、サービスで発生する可能性のあるエラーが WSDL の形で公開されます。クライアント側の開発者は、当該操作によりどのようなエラーが生じうるかをあらかじめ予測し、catch ブロック内に適切な処理を組み込んでおくことができます。Doing so results in the possible faults being advertised in the WSDL for the service, allowing client programmers to anticipate which faults can result from an operation, and write the appropriate catch statements.

try
{
     result = client.Divide(value1, value2);
}
catch (FaultException<MathFault> e)
{
 Console.WriteLine("FaultException<MathFault>: Math fault while doing "
  + e.Detail.operation
  + ". Problem: "
  + e.Detail.problemType);
}

状態管理State Management

ASP.NET Web サービスの実装には WebService の派生クラスを使うこともできます。The class used to implement an ASP.NET Web service may be derived from WebService.

public class Service : WebService, IEcho
{

 public string Echo(string input)
 {
  return input;
 }
}

この場合、基本クラス WebService に定義された Context プロパティを使って、HttpContext オブジェクトにアクセスすることになります。In that case, the class can be programmed to use the WebService base class’ Context property to access a HttpContext object. HttpContext オブジェクトには、アプリケーションやセッションの状態情報をそれぞれ更新、取得する、Application プロパティ、Session プロパティがあります。The HttpContext object can be used to update and retrieve application state information by using its Application property, and can be used to update and retrieve session state information by using its Session property.

ASP.NET では、HttpContext の Session プロパティでアクセスするセッション状態情報の、実際の格納場所を細かく制御できます。ASP.NET provides considerable control over where the session state information accessed by using the Session property of the HttpContext is actually stored. 格納場所としては、クッキー内、データベース内、稼動中のサーバーのメモリ上、状態管理用の特別なサーバーのメモリ上があり、It may be stored in cookies, in a database, in the memory of the current server, or in the memory of a designated server. サービスの構成ファイルで指定します。The choice is made in the service’s configuration file.

WCF では、状態管理の拡張可能なオブジェクトを提供します。The WCF provides extensible objects for state management. いずれも IExtensibleObject<T> を実装しています。Extensible objects are objects that implement IExtensibleObject<T>. 中でも重要な拡張可能オブジェクトは、ServiceHostBase および InstanceContext です。The most important extensible objects are ServiceHostBase and InstanceContext. ServiceHostBase を使用すると、同一ホスト上の全サービス型のあらゆるインスタンスからアクセスできる状態を管理できます。一方、InstanceContext を使用すると、同じサービス型のインスタンス内で実行されるコードからアクセスできる状態を管理できます。ServiceHostBase allows you to maintain state that all of the instances of all of the service types on the same host can access, while InstanceContext allows you to maintain state that can be accessed by any code running within the same instance of a service type.

ここでは、サービスの種類、TradingSystemが、ServiceBehaviorAttribute同じ WCF クライアント インスタンスからのすべての呼び出しは、サービスの種類の同じインスタンスにルーティングされますを指定します。Here, the service type, TradingSystem, has a ServiceBehaviorAttribute that specifies that all calls from the same WCF client instance are routed to the same instance of the service type.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class TradingSystem: ITradingService

次のクラス DealData に定義されている状態には、同じサービス型のインスタンス内で実行されるどのコードからでもアクセスできます。The class, DealData, defines state that can be accessed by any code running in the same instance of a service type.

internal class DealData: IExtension<InstanceContext>
{
 public string DealIdentifier = null;
 public Trade[] Trades = null;
}

サービス コントラクトの操作のいずれかを実装するサービス型のコードでは、状態オブジェクト DealData を、当該サービス型の現在のインスタンスに関する状態として追加することができます。In the code of the service type that implements one of the operations of the service contract, a DealData state object is added to the state of the current instance of the service type.

string ITradingService.BeginDeal()
{
 string dealIdentifier = Guid.NewGuid().ToString();
 DealData state = new DealData(dealIdentifier);
 OperationContext.Current.InstanceContext.Extensions.Add(state);
 return dealIdentifier;
}

この状態オブジェクトは、サービス コントラクトの他の操作を実装するコードから取得、更新できます。That state object can then be retrieved and modified by the code that implements another of the service contract’s operations.

void ITradingService.AddTrade(Trade trade)
{
 DealData dealData =  OperationContext.Current.InstanceContext.Extensions.Find<DealData>();
 dealData.AddTrade(trade);
}

ASP.NET では、経由でコントロールが用意されていますが、状態の情報、HttpContextクラスが実際に格納されている WCF では、少なくとも、初期のバージョンでは拡張可能なオブジェクトを格納する場所を細かく制御します。Whereas ASP.NET provides control over where state information in the HttpContext class is actually stored, WCF, at least in its initial version, provides no control over where extensible objects are stored. WCF サービスの ASP.NET 互換モードを選択するため、推奨する理由を構成します。That constitutes the very best reason for selecting the ASP.NET compatibility mode for a WCF service. このような制御が不可欠な応用の場合、ASP.NET 互換モードにすれば、ASP.NET と同様に HttpContext クラスの機能を活用できるばかりでなく、HttpContext クラスで管理する状態情報の実際の格納場所も制御できます。If configurable state management is imperative, then opting for the ASP.NET compatibility mode allows you to use the facilities of the HttpContext class exactly as they are used in ASP.NET, and also to configure where state information managed by using the HttpContext class is stored.

セキュリティSecurity

ASP.NET Web サービスのセキュリティ保全の手順は、IIS アプリケーションのセキュリティ保全の手順と同じです。The options for securing ASP.NET Web services are those for securing any IIS application. IIS 内でだけでなく、任意の .NET 実行可能ファイル内でも、WCF アプリケーションをホストできるため、WCF アプリケーションをセキュリティで保護するためのオプションに IIS の機能から独立して行う必要があります。Because WCF applications can be hosted not only within IIS but also within any .NET executable, the options for securing WCF applications must be made independent from the facilities of IIS. ただし、ASP.NET Web サービスを提供する機能では、ASP.NET 互換モードで実行されている WCF サービスを入手できます。However, the facilities provided for ASP.NET Web services are also available for WCF services running in ASP.NET compatibility mode.

セキュリティ:認証Security: Authentication

IIS は、匿名アクセスまたはさまざまな認証のモードのいずれかを選択する、アプリケーションへのアクセスを制御するための機能を提供します。Windows 認証、ダイジェスト認証、基本認証、および .NET Passport 認証します。IIS provides facilities for controlling access to applications by which you can select either anonymous access or a variety of modes of authentication: Windows Authentication, Digest Authentication, Basic Authentication, and .NET Passport Authentication. Windows 認証は、ASP.NET Web サービスへのアクセス制御に使えます。The Windows Authentication option can be used to control access to ASP.NET Web services. ただし、WCF アプリケーションが IIS 内でホストされているときに、さまざまなその他のオプション間での Windows 認証をサポートして、WCF によって、その認証を管理できるように、アプリケーションへの匿名アクセスを許可するように IIS を構成する必要があります。However, when WCF applications are hosted within IIS, IIS must be configured to permit anonymous access to the application, so that authentication can be managed by WCF itself, which does support Windows authentication among various other options. 他の認証方法としては、ユーザー名トークン、X.509 証明書、SAML トークン、CardSpace カードなどが組み込まれていますが、独自の認証機構を定義することも可能です。The other options that are built-in include username tokens, X.509 certificates, SAML tokens, and CardSpace card, but custom authentication mechanisms can also be defined.

セキュリティ:偽装Security: Impersonation

ASP.NET Web サービスは ASP.NET の ID 要素を使用して、あるユーザーに偽装することができます。あらかじめ設定した特定のユーザーでなくても、要求に資格情報が添えられていれば、その要求元ユーザーに偽装できます。ASP.NET provides an identity element by which an ASP.NET Web service can be made to impersonate a particular user or whichever user’s credentials are provided with the current request. ASP.NET 互換モードで実行されている WCF アプリケーションで偽装を構成するのには、その要素を使用できます。That element can be used to configure impersonation in WCF applications running in ASP.NET compatibility mode.

WCF 構成システムは、特定の権限を借用するユーザーを指定するため、独自の id 要素を提供します。The WCF configuration system provides its own identity element for designating a particular user to impersonate. また、WCF クライアントおよびサービス別に構成できます権限借用のため。Also, WCF clients and services can be independently configured for impersonation. クライアント側では、要求を送信する現在のユーザーに偽装する構成が可能です。Clients can be configured to impersonate the current user when they transmit requests.

<behaviors>
     <behavior name="DerivativesCalculatorClientBehavior">
      <clientCredentials>
      <windows allowedImpersonationLevel="Impersonation"/>
      </clientCredentials>
     </behavior>
</behaviors>

サービス側では、現在の要求と共に提供された資格情報のユーザーに偽装するように構成できます。Service operations can be configured to impersonate whichever user’s credentials are provided with the current request.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public void Receive(Message input)

セキュリティ:アクセス制御リストを使用した承認Security: Authorization using Access Control Lists

アクセス制御リスト (ACL) を使って .asmx ファイルへのアクセスを制限できます。Access Control Lists (ACLs) can be used to restrict access to .asmx files. ただし、WCF の .svc ファイルの Acl は、ASP.NET 互換モードでを除き無視されます。However, ACLs on WCF .svc files are ignored except in ASP.NET compatibility mode.

セキュリティ:ロール ベースの承認Security: Role-based Authorization

IIS の Windows 認証オプションを、ASP.NET 構成言語の承認要素と組み合わせて使用すると、ASP.NET Web サービスに対し、各ユーザーが属する Windows グループに基づくロール ベースの承認機構を提供できます。The IIS Windows Authentication option can be used in conjunction with the authorization element provided by the ASP.NET configuration language to facilitate role-based authorization for ASP.NET Web services based on the Windows groups to which users are assigned. ASP.NET 2.0 には、より汎用的なロール ベースの承認機構である、ロール プロバイダーが導入されました。ASP.NET 2.0 introduced a more general role-based authorization mechanism: role providers.

ロール プロバイダーとは、ユーザーが割り当てられたロールに関する問い合わせを行う、基本インターフェイスを実装したクラス群です。各ロール プロバイダーには、さまざまな情報源から必要な情報を取得する手段が組み込まれています。Role providers are classes that all implement a basic interface for enquiring about the roles to which a user is assigned, but each role provider knows how to retrieve that information from a different source. ASP.NET 2.0 には、Microsoft SQL Server データベースからロールの割り当てを検索できるロール プロバイダーと、Windows Server 2003 承認マネージャーから検索できるロール プロバイダーがあります。ASP.NET 2.0 provides a role provider that can retrieve role assignments from a Microsoft SQL Server database, and another that can retrieve role assignments from the Windows Server 2003 Authorization Manager.

ロール プロバイダーのメカニズムは、WCF アプリケーションなど、任意の .NET アプリケーションで ASP.NET とは無関係に実際に使用できます。The role provider mechanism can actually be used independently of ASP.NET in any .NET application, including a WCF application. WCF アプリケーションの次のサンプルの構成方法を示します、ASP.NET ロール プロバイダーを使用して選択されたオプション、ServiceAuthorizationBehaviorします。The following sample configuration for a WCF application shows how the use of an ASP.NET role provider is an option selected by means of the ServiceAuthorizationBehavior.

<system.serviceModel>
     <services>
         <service name="Service.ResourceAccessServiceType"
             behaviorConfiguration="ServiceBehavior">
             <endpoint
              address="ResourceAccessService"
              binding="wsHttpBinding"
              contract="Service.IResourceAccessContract"/>
         </service>
     </services>
     <behaviors>
       <behavior name="ServiceBehavior">
       <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
      </behavior>
     </behaviors>
</system.serviceModel>

セキュリティ:クレーム ベースの承認Security: Claims-based Authorization

WCF の最も重要な技術革新の 1 つは、クレームに基づく保護されたリソースへのアクセスを承認するための完全なサポートです。One of the most important innovations of WCF is its thorough support for authorizing access to protected resources based on claims. クレームは、型、権限、および値で構成されます。たとえば、運転免許証を考えてみましょう。Claims consist of a type, a right and a value, a drivers’ license, for example. ここには所持者に関する誕生日などの情報 (ここでいう「クレーム」) が記載されています。It makes a set of claims about the bearer, one of which is the bearer’s date of birth. つまり、クレームの型は「誕生日」、値は運転者の実際の誕生日です。The type of that claim is date of birth, while the value of the claim is the driver’s birth date. また、クレームの権限は、所持者がこの値に対してできることを表します。The right that a claim confers on the bearer specifies what the bearer can do with the claim’s value. 誕生日について言えば、所持者はこの情報を「見る」ことはできますが、「書き換える」ことはできません。In the case of the claim of the driver’s date of birth, the right is possession: the driver possesses that date of birth but cannot, for example, alter it. クレーム ベースの承認は、ロール ベースの承認を包含する概念です。というのも、ロールはクレームの 1 つの型であると考えることができるからです。Claims-based authorization encloses role-based authorization, because roles are a type of claim.

クレーム ベースの承認では、一連のクレームを操作のアクセス要求と比較し、その結果に応じてアクセスを許可または拒否します。Authorization based on claims is accomplished by comparing a set of claims to the access requirements of the operation and, depending on the outcome of that comparison, granting or denying access to the operation. WCF を使用して値を割り当てることで、クレーム ベースの承認をもう一度実行するクラスを指定することができます、ServiceAuthorizationManagerプロパティのServiceAuthorizationBehaviorします。In WCF, you can specify a class to use to run claims-based authorization, once again by assigning a value to the ServiceAuthorizationManager property of ServiceAuthorizationBehavior.

<behaviors>
     <behavior name='ServiceBehavior'>
     <serviceAuthorization
     serviceAuthorizationManagerType=
                   'Service.AccessChecker, Service' />
     </behavior>
</behaviors>

クレーム ベースの承認を行うクラスは、ServiceAuthorizationManager を継承し、AccessCheck() メソッドだけをオーバーライドして定義します。Classes used to run claims-based authorization must derive from ServiceAuthorizationManager, which has just one method to override, AccessCheck(). WCF サービスの操作が呼び出され、提供されるたびにこのメソッドを呼び出して、 OperationContext 、ユーザーのクレームを持つオブジェクトでそのServiceSecurityContext.AuthorizationContextプロパティ。WCF calls that method whenever an operation of the service is invoked and provides a OperationContext object, which has the claims for the user in its ServiceSecurityContext.AuthorizationContext property. WCF はセキュリティ トークンからユーザーに関するクレームをアセンブル、これが認証に指定されたユーザー、問題の操作をこれらの要求が十分であるかどうかを評価します。WCF does the work of assembling claims about the user from whatever security token the user provided for authentication, which leaves the of task of evaluating whether those claims suffice for the operation in question.

WCF は、任意の種類のセキュリティから要求を自動的に作成トークンは非常に重要な技術革新、認証メカニズムの完全に独立したクレーム ベースの承認のコードを可能になったためです。That WCF automatically assembles claims from any kind of security token is a highly significant innovation, because it makes the code for authorization based on the claims entirely independent of the authentication mechanism. これに対し、ACL やロール ベースの承認は、Windows 認証と密に関連し合っています。By contrast, authorization using ACLs or roles in ASP.NET is closely tied to Windows authentication.

セキュリティ:機密性Security: Confidentiality

ASP.NET Web サービスとの間でやり取りするメッセージの機密性は、トランスポート層で、IIS 上のアプリケーションが Secure Hypertext Transfer Protocol (HTTPS) を使うように構成することによって確保します。The confidentiality of messages exchanged with ASP.NET Web services can be ensured at the transport level by configuring the application within IIS to use the Secure Hypertext Transfer Protocol (HTTPS). IIS 内でホストされる WCF アプリケーションは、同じを実行できます。The same can be done for WCF applications hosted within IIS. ただし、IIS の外部でホストされる WCF アプリケーションは、セキュリティで保護されたトランスポート プロトコルを使用しても構成できます。However, WCF applications hosted outside of IIS can also be configured to use a secure transport protocol. もっと重要な WCF アプリケーションを構成して Ws-security プロトコルを使用して、配送される前に、メッセージをセキュリティで保護することもできます。More important, WCF applications can also be configured to secure the messages before they are transported, using the WS-Security protocol. メッセージの本体を WS-Security で保護することにより、最終送信先に到達するまでの中継ノードで機密が洩れないようにすることができます。Securing just the body of a message using WS-Security allows it to be transmitted confidentially across intermediaries before reaching its final destination.

グローバリゼーションGlobalization

ASP.NET 構成言語では、個々のサービスごとにカルチャを指定することができます。The ASP.NET configuration language allows you to specify the culture for individual services. WCF では、ASP.NET 互換モードで以外には、その構成設定をサポートしません。The WCF does not support that configuration setting except in ASP.NET compatibility mode. ASP.NET 互換モードを使用しない WCF サービスをローカライズするには、カルチャに固有のアセンブリにサービスの種類をコンパイルして各カルチャに固有のアセンブリのカルチャに固有の別個のエンドポイントがあります。To localize a WCF service that does not use ASP.NET compatibility mode, compile the service type into culture-specific assemblies, and have separate culture-specific endpoints for each culture-specific assembly.

関連項目See also