我的操作方法设置为仅接受GET请求。如果向其发送除GET之外的动词,则不允许使用' HTTP 405方法'响应将被发送回客户端。但是每当发送除GET之外的动词时我都需要记录它。我目前正在尝试的方法是尝试引发异常(我不知道要捕获哪一个),然后在catch块中进行日志记录。我的行动方法如下:
[RoutePrefix("api/Resource")]
public class MyController : ApiController
{
.
.
.
[Route("MyRoute")]
[ResponseType(typeof(IEnumerable<MyResource>))]
[HttpGet]
public async Task<IHttpActionResult> GetMyResourceAsync()
{
try
{
.
.
.
}
catch (WhichException e) // which exception do I catch here if a verb other than GET is sent by a client?
{
MyLogger.Log("Invalid http verb!");
}
}
.
.
.
}
当我尝试使用postman访问资源,并指定一个动词如POST或PUT时,我得到一个HTTP 405响应,但我不确定在我的action方法中捕获哪个异常以拦截非GET请求。它不一定是通过引发异常,但是任何其他记录非GET请求的方式都可以。
答案 0 :(得分:3)
正如评论中所提到的,如果您有一个Http.Get(webapi方法),并且您发送了一个POST,那么该方法永远不会被触发。 您可能缺少的是Http.Get是默认值。
您可能还想查看REST基本理解。
http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/
当您的控制器运行时,它是Method&#34; Type&#34;的组合。 (GET,POST,PUT,DELETE) 和 MethodName(微软为您处理)... ...调用方法。
因此,一个用[HttpGet]
修饰的方法(或因为没有应用任何属性...然后默认为HttpGet)永远不会触发POST请求(从客户端发送)。所以你的概念是&#34;捕捉错误的方法&#34;在WebApi世界里没有意义。
这是一个更好的解决方案:
考虑编写ActionFilter
这是一个简单的(显示Request.Method)(显然,您可以在Request.Method上过滤非GET请求):
public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute /* from #region Assembly System.Web.Http.dll, v4.0.0.0 // C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.dll #endregion */
{
public MyActionFilter()
{
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
Console.WriteLine("OnActionExecuting:" + actionContext.Request.Method);
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
Console.WriteLine("OnActionExecuted:" + actionExecutedContext.Request.Method);
}
}
您可以将过滤器应用于:
方法
和/或
A(webapi)控制器(提示,如果你想将它添加到N个&#34;你的&#34; Api控制器,创建一个基础(抽象)控制器,将属性添加到该控制器并继承特定的来自基础/抽象控制器的控制器)
OR
&#34;全局&#34;与
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.Blah.Blah.Blah; /* already existing code */
/* this is the new code you need to add (line below) */
config.Filters.Add(new MyActionFilter());
}