如何将非GET请求记录到我的操作方法?

时间:2016-02-24 15:32:46

标签: asp.net-web-api httpverbs

我的操作方法设置为仅接受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请求的方式都可以。

1 个答案:

答案 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());
}