クライアント スクリプトへの WCF サービスの公開
更新 : 2007 年 11 月
Windows Communication Foundation (WCF) は、サービス指向アプリケーションを構築するための Microsoft 統一プログラミング モデルです。ASP.NET AJAX と JSON (JavaScript Object Notation) データ形式がサポートされています。このモデルにより、WCF サービスは、ECMAScript (JavaScript) コードを実行し、HTTP 要求を使用して WCF サービスにアクセスできる Web ページに機能を公開できるようになります。
WCF サービスを既に作成している場合は、AJAX 対応 Web ページのスクリプトからサービスにアクセスできるようにするためのエンドポイントを追加できます。このトピックでは、ブラウザで実行される JavaScript で WCF サービスを利用できるようにする方法を説明します。
.NET Framework によって、ページの読み込み時に WCF サービスの JavaScript プロキシ クラスが自動的に作成され、プロキシ クラス スクリプトがブラウザにダウンロードされます。これらのプロキシ クラスは、Microsoft AJAX Library の Sys.Net.WebServiceProxy クラスから派生します。
JavaScript プロキシ クラスの対応するメソッドを呼び出すことにより、WCF サービス操作を呼び出すことができます。詳細については、「クライアント スクリプトからの Web サービスの呼び出し」を参照してください。
クライアント スクリプトから WCF サービスへのアクセスを可能にする
クライアント スクリプトから WCF サービスを利用できるようにするには、次の要件を満たす必要があります。
サービスは、拡張子が .svc のファイルを含む Web アプリケーションでホストする必要があります。このファイルには、WCF サービスを指す @ ServiceHost ディレクティブが含まれます。@ ServiceHost ディレクティブの例を次に示します。
<%@ ServiceHost Language=C# Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.cs"%>
<%@ ServiceHost Language=VB Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.vb"%>
スクリプトからの Web サービスの呼び出しをサポートするように Web アプリケーションを構成する必要があります。詳細については、「方法 : ASP.NET AJAX で WCF サービスを構成する」を参照してください。
サービスは、ServiceContractAttribute でマークされたインターフェイスを実装するクラスであることが必要です。スクリプトから呼び出される個々のサービス操作 (メソッド) は、OperationContractAttribute 属性で修飾されている必要があります。
ServiceContractAttribute でマークされたインターフェイスを実装するクラスの例を次に示します。
namespace Samples.Aspnet
{
[ServiceContract(Namespace="MyServices.org")]
public interface ISimpleService
{
[OperationContract]
string HelloWorld1(string value1);
[OperationContract]
string HelloWorld2(DataContractType dataContractValue1);
}
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SimpleService : ISimpleService
{
public SimpleService()
{ }
public string HelloWorld1(string value1)
{
return "Hello " + value1;
}
public string HelloWorld2(DataContractType dataContractValue1)
{
return "Hello " + dataContractValue1.FirstName +
" " + dataContractValue1.LastName;
}
}
[DataContract]
public class DataContractType
{
string firstName;
string lastName;
[DataMember]
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
[DataMember]
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
Namespace Aspnet.Samples.SimpleService
<ServiceContract(NameSpace="MyServices.org")> _
Public Interface ISimpleService
<OperationContract()> _
Function HelloWorld1(ByVal value1 As String) As String
<OperationContract()> _
Function HelloWorld2(ByVal dataContractValue1 _
As DataContractType) As String
End Interface 'ISimpleService
<ServiceBehavior(IncludeExceptionDetailInFaults:=True), _
AspNetCompatibilityRequirements(RequirementsMode:= _
AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class SimpleService
Implements ISimpleService
Public Sub New()
End Sub 'New
Public Function HelloWorld1(ByVal value1 As String) As String _
Implements ISimpleService.HelloWorld1
Return "Hello " + value1
End Function 'HelloWorld1
Public Function HelloWorld2(ByVal dataContractValue1 _
As DataContractType) As String _
Implements ISimpleService.HelloWorld2
Return "Hello " + dataContractValue1.FirstName + " " + _
dataContractValue1.LastName
End Function 'HelloWorld2
End Class 'SimpleService
<DataContract()> _
Public Class DataContractType
Private _firstName As String
Private _lastName As String
<DataMember()> _
Public Property FirstName() As String
Get
Return _firstName
End Get
Set(ByVal value As String)
_firstName = value
End Set
End Property
<DataMember()> _
Public Property LastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
End Class 'DataContractType
End Namespace
詳細については、「WCF サービスと ASP.NET」を参照してください。
ASP.NET Web ページでクライアント スクリプトから WCF サービスを使用する
ASP.NET Web ページのクライアント スクリプトから WCF サービスを呼び出すには、まず ScriptManager コントロールをページに追加します。次に、asp:ServiceReference 子要素を ScriptManager コントロールに追加し、WCF サービスを指すように path 属性を設定して、ServiceReference オブジェクトを宣言によって設定します。サービス参照の例を次に示します。
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference
Path="http://<serverhost>/SimpleService.svc"/>
</Services>
</asp:ScriptManager>
ServiceReference オブジェクトが参照できるのは、同じドメイン内の Web サービスだけです。Web サービスのパスには、相対パス、アプリケーション相対パス、ドメイン相対パス、または絶対パスを使用できます。絶対パスの場合は、そのパスが同じドメイン内に存在することを確認する必要があります。
この ScriptManager コントロールを含むページが表示されるときに、WCF サービスの JavaScript プロキシ クラスが作成されます。このプロキシ クラスには、各サービス操作に対応する機能が含まれます。ページには、Web サービス メソッドの入力パラメータまたは戻り値として使用されるサーバーのデータ型に対応する JavaScript プロキシ クラスも含まれます。これにより、これらのパラメータを初期化するクライアント スクリプトを記述して、メソッド呼び出しに渡すことができます。