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



我的操作方法设置为仅接受 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 响应,但我不确定在我的操作方法中捕获哪个异常以拦截非 GET 请求。它不一定需要通过引发异常,但任何其他记录非GET请求的方法也可以。

正如评论中提到的,如果你有一个Http.Get(webapi方法),并且你发送了一个POST,那么该方法永远不会触发。您可能缺少的是 Http.Get 是默认值。

您可能还想查看 REST 的基本理解。

http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/

当你的控制器运行时,它是方法"类型"(获取、发布、放置、删除)方法名称(微软为你处理)的组合......调用该方法。

因此,用[HttpGet]修饰的方法(或者因为没有应用任何属性......然后默认为 HttpGet)永远不会触发 POST 请求(从客户端发送)。 因此,您的"捕获错误方法"的概念在WebApi世界中没有意义。

这是一个更好的解决方案:

考虑编写操作筛选器

这是一个简单的(显示 Request.Method)(显然,您可以过滤非 GET 请求的 Request.Method):

 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.NETASP.NET MVC     4AssembliesSystem.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);
    }
}

您可以将筛选器应用于:

一种方法

和/或

一个(webapi)控制器(提示,如果要将其添加到N个"您的"Api控制器中,请创建一个基本(抽象)控制器,将属性添加到该控制器并从基本/抽象控制器继承特定控制器)

"全球"与

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

最新更新