ASP.NET Web サービスを Windows Communication Foundation (WCF) に移行する手順を次に示します。
手順
ASP.NET Web サービス コードを WCF に移行するには
サービスの包括的なテスト セットが存在することを確認します。
サービスの WSDL を生成し、サービスの .asmx ファイルと同じフォルダーに保存します。
ASP.NET Web サービスをアップグレードして、.NET 2.0 を基盤として動作するようにします。まず、.NET Framework 2.0 を IIS のアプリケーションに配置してから、Visual Studio 2005 を使用してコードを自動変換します。この自動変換の手順については、「Visual Studio .NET 2002/2003 から Visual Studio 2005 への Web プロジェクト変換ステップバイステップ ガイド」を参照してください。テスト セットを実行します。
WebService 属性の
Namespace
およびName
パラメーターにまだ値を指定していない場合は、ここで明示的に指定します。WebMethodAttribute のMessageName
パラメーターについても同様に値を指定してください。メソッドに要求が送られるように SOAPAction HTTP ヘッダーに値を明示的に指定していない場合は、SoapDocumentMethodAttribute でAction
パラメーターの既定値を明示的に指定します。[WebService(Namespace = "http://tempuri.org/", Name = "Adder")] public class Adder { [WebMethod(MessageName = "Add")] [SoapDocumentMethod(Action = "http://tempuri.org/Add")] public double Add(SumInput input) { double sum = 0.00; foreach (double inputValue in input.Input) { sum += inputValue; } return sum; } }
変更点をテストします。
クラスのメソッド本体にある実質的なコードを、独立した別のクラスに移動し、これを元のクラスで使用します。
[WebService(Namespace = "http://tempuri.org/", Name = "Adder")] public class Adder { [WebMethod(MessageName = "Add")] [SoapDocumentMethod(Action = "http://tempuri.org/Add")] public double Add(SumInput input) { return new ActualAdder().Add(input); } } internal class ActualAdder { internal double Add(SumInput input) { double sum = 0.00; foreach (double inputValue in input.Input) { sum += inputValue; } return sum; } }
変更点をテストします。
WCF のアセンブリである System.ServiceModel および System.Runtime.Serialization の参照を ASP.NET Web サービス プロジェクトに追加します。
ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を実行し、WSDL を基に WCF クライアント クラスを生成します。生成されたクラス モジュールをソリューションに追加します。
前の手順で生成したクラス モジュールには、インターフェイスの定義が含まれます。
[System.ServiceModel.ServiceContractAttribute()] public interface AdderSoap { [System.ServiceModel.OperationContractAttribute( Action="http://tempuri.org/Add", ReplyAction="http://tempuri.org/Add")] AddResponse Add(AddRequest request); }
ASP.NET Web サービス クラスの定義を変更して、次のコード例のように、このインターフェイスを実装するようにします。
[WebService(Namespace = "http://tempuri.org/", Name = "Adder")] public class Adder: AdderSoap { [WebMethod(MessageName = "Add")] [SoapDocumentMethod(Action = "http://tempuri.org/Add")] public double Add(SumInput input) { return new ActualAdder().Add(input); } public AddResponse Add(AddRequest request) { return new AddResponse( new AddResponseBody( this.Add(request.Body.input))); } }
プロジェクトをコンパイルします。手順 9. で生成したコードには型定義の重複があるため、エラーが何件か発生する可能性があります。発生したエラーは、通常は、元からあった方の型定義を削除することで修正できます。変更点をテストします。
WebService、WebMethodAttribute、SoapDocumentMethodAttribute など、ASP.NET 固有の属性を削除します。
public class Adder: AdderSoap { public double Add(SumInput input) { return new ActualAdder().Add(input); } public AddResponse Add(AddRequest request) { return new AddResponse( new AddResponseBody( this.Add(request.Body.input))); } }
以上の手順により、クラスは WCF サービス型になりました。ASP.NET Web サービスが次のいずれかに依存する場合は、WCF ASP.NET 互換モードであることを要求するよう、クラスのモードを設定します。
HttpContext クラス
ASP.NET プロファイル
.asmx ファイルの ACL
IIS 認証オプション
ASP.NET の偽装オプション
ASP.NET のグローバリゼーション
[System.ServiceModel.AspNetCompatibilityRequirements( RequirementsMode=AspNetCompatbilityRequirementsMode.Required)] public class Adder: AdderSoap
元の .asmx ファイルを .asmx.old と改名します。
サービスの WCF サービス ファイルを作成し、その拡張子を .asmx として、IIS のアプリケーション ルートに保存します。
<%@Service Class="MyOrganization.Adder" %> <%@Assembly Name="MyServiceAssembly" %>
サービスの WCF 構成を Web.config ファイルに追加します。basicHttpBinding Elementを使用する設定、前の手順で作成した .asmx サービス ファイルを使用する設定、WSDL を生成する代わりに手順 2. で作成した WSDL を使用する設定を行います。さらに、必要に応じて、ASP.NET 互換モードを使用するように設定します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <compilation> <buildProviders> <remove extension=".asmx" /> <add extension=".asmx" type= "System.ServiceModel.Activation.ServiceBuildProvider, T:System.ServiceModel, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </buildProviders> </compilation> </system.web> <system.serviceModel> <services> <service name="MyOrganization.Adder " behaviorConfiguration="AdderBehavior"> <endpoint address="” binding="basicHttpBinding" contract="AdderSoap "/> </service> </services> <behaviors> <behavior name="AdderBehavior"> <metadataPublishing enableMetadataExchange="true" enableGetWsdl="true" enableHelpPage="true" metadataLocation= "http://MyHost.com/AdderService/Service.WSDL"/> </behavior> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled ="true"/> </system.serviceModel> </configuration>
構成を保存します。
プロジェクトをコンパイルします。
テスト セットを実行して、想定どおりに変更されていることを確認してください。
参照
処理手順
方法 : ASP.NET Web サービス クライアント コードを Windows Communication Foundation に移行する