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 Version 3.0 では、WCF HttpModule が、すべての ASP.NET アプリケーションが WCF 対応になるように、ルートの Web.config ファイルにインストールされます。これによりパフォーマンスに影響が出る場合があるため、次の例に示すように、Web.config ファイルの ServiceModel を削除することもできます。
<httpModules>
<remove name=”ServiceModel” />
<httpModules/>