1

我正在尝试创建一个以不同方式响应 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)]

但这也没有什么不同。

4

2 回答 2

2

我有个主意。

对于初学者,您的 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并根据使用的方法调用不同的方法。

于 2012-10-29T14:43:31.543 回答
0

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

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

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

于 2012-10-28T15:49:07.660 回答