ASP.NET Web サービスとの相互運用
ASP.NET Web サービスと Windows Communication Foundation (WCF) Web サービスの相互運用性は、この 2 つのテクノロジを使用して実装されたサービスを確実に WS-I Basic Profile 1.1 仕様に準拠させることによって実現されます。 WS-I Basic Profile 1.1 準拠の ASP.NET Web サービスは、WCF システム指定のバインディングである BasicHttpBinding を使用することで WCF クライアントと相互運用できます。
次のサンプル コードに示すように、WebService 属性と WebMethodAttribute 属性をインターフェイス (クラスではありません) に追加し、そのインターフェイスを実装するクラスを作成するという、ASP.NET 2.0 のオプションを使用します。
[WebService]
public interface IEcho
{
[WebMethod]
string Echo(string input);
}
public class Service : IEcho
{
public string Echo(string input)
{
return input;
}
}
WebService 属性を持つインターフェイスは、同じコントラクトを異なる方法で実装する可能性のあるさまざまなクラスで再利用可能なサービスによって実行される操作のコントラクトを構成するため、このオプションを使用することをお勧めします。
SoapDocumentServiceAttribute 属性を使用する場合、SOAPAction
HTTP ヘッダーではなく、SOAP メッセージの本文要素の完全修飾名に基づいてメッセージをメソッドへルーティングすることは避けます。 WCF は、SOAPAction
HTTP ヘッダーを使用してメッセージをルーティングします。
XmlSerializer によって既定で型のシリアル化が行われる XML は、XML の名前空間が明示的に定義されている場合、DataContractSerializer によって型のシリアル化が行われる XML と意味的に同一です。 WCF を採用することを想定して、ASP.NET Web サービスで使用するデータ型を定義する場合は、次の操作を実行します。
XML スキーマではなく、.NET Framework クラスを使用して型を定義します。
SerializableAttribute と XmlRootAttribute だけをそのクラスに追加します。後者を使用して型の名前空間を明示的に定義してください。 .NET Framework クラスを XML に変換する方法を制御する目的で、System.Xml.Serialization 名前空間の属性を追加しないでください。
この手法を採用すると、後から DataContractAttribute および DataMemberAttribute を追加することで、転送のためにクラスをシリアル化する XML に大きな変更を加えることなく .NET クラスをデータ コントラクトにすることができます。 WCF アプリケーションは、ASP.NET Web サービスがメッセージ内で使用する型をデータ コントラクトとして処理できます。これには、さまざまな利点がありますが、特に、WCF アプリケーションのパフォーマンスが向上します。
インターネット インフォメーション サービス (IIS) に用意されている認証オプションは使用しないでください。 これらは、WCF クライアントではサポートされません。 サービスをセキュリティで保護する必要がある場合は、WCF で提供されるオプションを使用します。これらのオプションの方が信頼性が高く、標準プロトコルに基づいているためです。
ServiceModel HttpModule の読み込みがパフォーマンスに及ぼす影響
.NET Framework 3.0 では、すべての ASP.NET アプリケーションが WCF 対応になるように、WCF の HttpModule
がルートの Web.config ファイルにインストールされました。 これによりパフォーマンスに影響が出る場合があるため、次の例に示すように、Web.config ファイルの ServiceModel
を削除することもできます。
<httpModules>
<remove name="ServiceModel" />
</httpModules>