方法 : ASP.NET AJAX エンドポイントのために HTTP POST または HTTP GET を選択する

Windows Communication Foundation (WCF) では、クライアント Web サイトの JavaScript から呼び出される ASP.NET AJAX 対応のエンドポイントを公開するサービスを作成できます。このようなサービスを構築するための基本的な手順については、「方法 : 構成を使用して ASP.NET AJAX エンドポイントを追加する」および「方法 : 構成を使用せずに ASP.NET AJAX エンドポイントを追加する」を参照してください。

ASP.NET AJAX では、HTTP POST 動詞および HTTP GET 動詞を使用する操作をサポートしており、HTTP POST が既定となっています。副作用がなく、返されるデータがほとんど、またはまったく変更されない操作を作成する場合は、代わりに HTTP GET を使用します。GET 操作の結果はキャッシュされます。つまり、同じ操作についての複数の呼び出し結果がサービスに対する 1 回だけの要求で済むことになります。このキャッシュ動作は、WCF によってではなく、任意のレベル (ユーザーのブラウザやプロキシ サーバー、その他のレベル) で実行できます。キャッシュはサービス パフォーマンスの向上が望まれる場合には有効ですが、データの変更が頻繁であったり、操作によって何かのアクションが実行される場合は適していません。

たとえば、ユーザーの音楽ライブラリを管理するサービスをデザインする場合、アルバムのタイトルに基づいてアーティストを検索する操作では GET の使用は役に立ちますが、ユーザーの個人コレクションにアルバムを追加する操作では POST を使用する必要があります。

キャッシュの有効期間を制御するには、OutgoingWebResponseContext 型を使用します。たとえば、1 時間ごとに更新される天気予報を返すサービスをデザインする場合、GET を使用することが考えられますが、サービスを使用するユーザーが古いデータにアクセスすることを防止するために、キャッシュの有効期間を 1 時間以内に制限します。

Script Manager コントロールを使用する ASP.NET AJAX ページからサービスを使用する場合は、Script Manager のメカニズムにより適切な要求の種類が発行されることが保証されているため、操作で GET と POST のどちらを使用しても違いはありません。

HTTP GET 操作では、複合型データ コントラクト型も含めて、POST 操作でサポートされるすべての入力パラメータを使用できます。ただし、多くの場合、キャッシュの効率が低下するため、多数のパラメータ、または複雑すぎるパラメータを GET 操作で使用しないことをお勧めします。

このトピックでは、WebGetAttribute または WebInvokeAttribute 属性を追加することで、サービス コントラクトに適切な操作を GET と POST から選択する方法について説明します。サービスの実行に必要な他の手順 (サービスの実装、構成、およびホスト) は、WCF の ASP.NET AJAX サービスで使用される手順と同様になります。

WebGetAttribute でマークされた操作では、常に GET 要求が使用されます。WebInvokeAttribute でマークされた操作と、これらの 2 つの属性のどちらでもマークされていない操作では、POST 要求が使用されます。WebInvokeAttribute は、Method プロパティを介して、GET と POST 以外の HTTP 動詞 (PUT や DELETE など) を使用できます。ただし、これらの動詞は ASP.NET AJAX ではサポートされていません。Script Manager コントロールを使用して ASP.NET ページからサービスを使用する場合は、Method プロパティは使用しないでください。

GET に切り替える実施例については、「Basic AJAX Service」のサンプルを参照してください。

POST の使用例については、「AJAX Service Using HTTP POST」のサンプルを参照してください。

HTTP GET または HTTP POST 要求に応答する WCF サービスを作成するには

  1. ServiceContractAttribute 属性でマークされたインターフェイスを使用して、基本的な WCF サービス コントラクトを定義します。各操作を OperationContractAttribute でマークします。WebGetAttribute 属性を追加して、操作が HTTP GET 要求に応答するように指定します。HTTP POST を明示的に指定するために WebInvokeAttribute 属性を追加することもできます。また、属性を指定しなければ、既定で HTTP POST となります。

    [ServiceContract]
    public interface IMusicService
    {
        //This operation uses a GET method.
        [OperationContract]
        [WebGet]
        string LookUpArtist(string album);
    
        //This operation will use a POST method.
        [OperationContract]
        [WebInvoke]
        void AddAlbum(string user, string album);
    
        //This operation will use POST method by default
        //since nothing else is explicitly specified.
        [OperationContract]
        string[] GetAlbums(string user);
    
        //Other operations omitted…
    
    }
    
  2. MusicService を使用して、IMusicService サービス コントラクトを実装します。

    public class MusicService : IMusicService
    {
        public void AddAlbum(string user, string album)
        {
            //Add implementation here.
        }
    
         //Other operations omitted…
    }
    
  3. アプリケーションで、.svc という拡張子を付けて新しい service ファイルを作成します。サービスに該当する @ServiceHost ディレクティブ情報を追加して、このファイルを編集します。ASP.NET AJAX エンドポイントが自動的に構成されるように、@ServiceHost ディレクティブで WebScriptServiceHostFactory を使用することを指定します。

    <%@ServiceHost 
        language=c# 
        Debug="true" 
        Service="Microsoft.Ajax.Samples.MusicService"
        Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory
    %>
    

サービスを呼び出すには

  1. ブラウザを使用すると、クライアントのコードなしでサービスの GET 操作をテストできます。たとえば、サービスがアドレス "http://example.com/service.svc" で構成されている場合、ブラウザのアドレス バーに「http://example.com/service.svc/LookUpArtist?album=SomeAlbum」と入力するとサービスが呼び出され、応答がダウンロードまたは表示されます。

  2. GET 操作によるサービスは、他の ASP.NET AJAX サービスと同様に、サービス URL を ASP.NET AJAX Script Manager コントロールのスクリプト コレクションに入力することで使用できます。例については、「Basic AJAX Service sample」を参照してください。

関連項目

タスク

方法 : AJAX 対応 ASP.NET Web サービスを WCF に移行する

概念

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