ASP.NET Web服务 - 将方法限制为HttpGet或HttpPost

时间:2012-10-28 10:32:10

标签: asp.net web-services http-post asmx http-get

我正在尝试制作一个能够以不同方式响应HttpGet和HttpPost请求的Web服务。

我已经启用了HttpGet:

<webServices>
  <protocols>
    <add name="HttpGet"/>
  </protocols>
</webServices>

我创建了2个函数,一个应该针对HttpPost请求触发,另一个针对HttpGet:

[WebMethod]
[HttpPost]
[ActionName("HelloWorld")]
public string HelloWorldPost()
{
    return "Hello POST World";
}

[WebMethod]
[HttpGet]
public string HelloWorld()
{
    return "Hello GET World";
}

然而,HttpGet,HttpPost和ActionName似乎完全被忽略了。对HelloWorld的所有请求(post或get)都会触发第二个函数。我是否需要以其他方式做到这一点?我也尝试用这个来限制函数:

[ScriptMethod(UseHttpGet = false)]

但这也没有任何区别。

2 个答案:

答案 0 :(得分:1)

我有个主意。

对于初学者,您的web服务的web.config文件将如下所示:

<webServices>
  <protocols>
     <add name="HttpGet"/>
     <add name="HttpPost"/>
  </protocols>
</webServices>

接下来,无论使用何种表单方法,都可以调用Web方法x。

[WebMethod]
public string X()
{
  //so, you detect which method is invoked by using 
  // HttpContext.Current.Request.HttpMethod
  if (HttpContext.Current.Request.HttpMethod == "POST") {
    //do something now you know it is post method
  }
  else {
    //now, it should be get method and you do something different
  }
//end of web method
}

我的主要观点是你检查HttpContext.Current.Request.HttpMethod并根据使用的方法调用不同的方法。

答案 1 :(得分:0)

ASP.NET Web Service应用程序的行为与ASP.NET MVC不同,后者符合您的期望。在您的代码中,HttpGet / HttpPost和ActionName属性都属于MVC,如Amiram Korach所述。托管为Web服务应用程序时,将忽略这些属性。

Web服务应用程序中的“路由”基于方法名称(HelloWorldPost和HelloWorld),而不是基于HTTP VERB。

要触发POST流程,您必须调用HelloWorldPost(service.asmx / HelloWorldPost)