如何:在 ASP.NET AJAX 终结点的 HTTP POST 和 HTTP GET 请求之间进行选择

使用 Windows Communication Foundation (WCF) 可以创建服务来公开支持 ASP.NET AJAX 并且可从客户端网站上的 JavaScript 中调用的终结点。 有关构建此类服务的基本过程,请参阅如何:使用配置添加 ASP.NET AJAX 终结点如何:在不使用配置的情况下添加 ASP.NET AJAX 终结点

ASP.NET AJAX 支持使用 HTTP POST 和 HTTP GET 谓词(HTTP POST 为默认谓词)的操作。 创建没有任何副作用并返回很少或从不进行更改的数据的操作时,应改用 HTTP GET。 GET 操作的结果可以缓存,这意味着对相同操作的多次调用可能导致只请求一次服务。 缓存操作不由 WCF 完成,但是可以在任何级别(用户的浏览器中、代理服务器上以及其他级别)进行。如果要提高服务性能,则使用缓存会比较有利,但在数据频繁更改或操作执行某些动作时可能不可行。

例如,如果设计服务来管理用户的音乐库,则基于唱片集的标题查找艺术家的操作可以从使用 GET 中获益,但是将唱片集添加到用户的个人收藏集的操作必须使用 POST。

若要控制缓存的生存期,请使用 OutgoingWebResponseContext 类型。 例如,在设计返回每小时更新的天气预报时会使用 GET,但应将缓存持续时间限制在一小时以内,以防止服务的用户访问过时的数据。

在使用来自使用脚本管理器控件的 ASP.NET AJAX 页上的服务时,操作是使用 GET 还是 POST 并没有区别,脚本管理器机制会确保发出正确的请求类型。

HTTP GET 操作使用由 POST 操作支持的任何输入参数,其中包括复杂的数据协定类型。 但是,大多数情况下建议避免在 GET 操作中使用太多的参数或太复杂的参数,原因是这样会降低缓存的效率。

本主题演示了如何通过在服务协定中将 WebGetAttributeWebInvokeAttribute 属性添加到相关的操作以在 GET 和 POST 之间选择。 运行服务所需的其他步骤(实现、配置和托管服务)与在 WCF 中由任何 ASP.NET AJAX 服务使用的步骤类似。

WebGetAttribute 标记的操作始终使用 GET 请求。 以 WebInvokeAttribute 标记或未以这两个属性中的任何一个进行标记的操作将使用 POST 请求。 通过 WebInvokeAttribute 属性,Method 允许使用 GET 和 POST 之外的其他 HTTP 谓词(如 PUT 和 DELETE 等)。 但是,ASP.NET AJAX 不支持这些谓词。 如果打算使用脚本管理器控件来使用来自 ASP.NET 页上的服务,请不要使用 Method 属性。

有关切换到 GET 的有效示例,请参阅基本 AJAX 服务示例。

有关使用 POST 的示例,请参阅使用 HTTP POST 的 AJAX 服务示例。

创建响应 HTTP GET 或 HTTP POST 请求的 WCF 服务

  1. 通过用 ServiceContractAttribute 属性标记的接口定义基本 WCF 服务协定。 用 OperationContractAttribute 标记每个操作。 添加 WebGetAttribute 属性以规定操作应响应 HTTP GET 请求。 也可以添加 WebInvokeAttribute 属性来显式指定 HTTP POST,或不指定属性(默认设置为 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. 使用 IMusicService 实现 MusicService 服务协定。

    public class MusicService : IMusicService  
    {  
        public void AddAlbum(string user, string album)  
        {  
            //Add implementation here.  
        }  
    
         //Other operations omitted…  
    }  
    
  3. 在应用程序中创建一个名为 service 的新文件(扩展名为 .svc)。 编辑此文件,在其中为服务添加适当的 @ServiceHost 指令信息。 指定在 @ServiceHost 指令中使用 WebScriptServiceHostFactory 来自动配置 ASP.NET AJAX 终结点。

    <%@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. 可以像使用任何其他 ASP.NET AJAX 服务一样将服务与 GET 操作一起使用,即,在 ASP.NET AJAX 脚本管理器控件的“脚本”集合中输入相应的服务 URL。 有关示例,请参阅基本 AJAX 服务

请参阅