次の方法で共有


クライアント スクリプトへの 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 プロキシ クラスも含まれます。これにより、これらのパラメータを初期化するクライアント スクリプトを記述して、メソッド呼び出しに渡すことができます。

参照

概念

ASP.NET AJAX での Web サービスの使用

クライアント スクリプトからの Web サービスの呼び出し

その他の技術情報

JSON などのデータ転送形式のサポート

方法 : 構成を使用して ASP.NET AJAX エンドポイントを追加する

ASP.NET AJAX 用の WCF サービスの作成

方法 : AJAX 対応 WCF サービスとこのサービスにアクセスする ASP.NET クライアントを作成する