我正在尝试制作一个能够以不同方式响应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)]
但这也没有任何区别。
答案 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)