方法 : ASP.NET Web サービス コードを Windows Communication Foundation に移行する
ASP.NET Web サービスを Windows Communication Foundation (WCF) に移行する手順を次に示します。
手順
ASP.NET Web サービス コードを WCF に移行するには
サービスの包括的なテスト セットが存在することを確認します。
サービスの WSDL を生成し、サービスの .asmx ファイルと同じフォルダに保存します。
ASP.NET Web サービスをアップグレードして、.NET 2.0 を基盤として動作するようにします。まず、.NET Framweork 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 Metadata Utility Tool (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 に移行する