Asp.net web api 如何将非GET请求记录到操作方法?

Asp.net web api 如何将非GET请求记录到操作方法?,asp.net-web-api,httpverbs,Asp.net Web Api,Httpverbs,我的操作方法设置为仅接受GET请求。如果向其发送GET以外的谓词,则会将“HTTP 405 Method not allowed”响应发送回客户端。但我需要在每次发送GET以外的动词时记录它。我目前尝试的方法是,尝试引发一个异常(我不知道要捕获哪个异常),然后在catch块内进行日志记录。我的行动方法如下: [RoutePrefix("api/Resource")] public class MyController : ApiController { . . . [Route("MyR

我的操作方法设置为仅接受GET请求。如果向其发送GET以外的谓词,则会将“HTTP 405 Method not allowed”响应发送回客户端。但我需要在每次发送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!");
        }

    }
.
.
.
}
[RoutePrefix(“api/资源”)]
公共类MyController:ApiController
{
.
.
.
[路线(“我的路线”)]
[责任类型(类型(IEnumerable))]
[HttpGet]
公共异步任务GetMyResourceAsync()
{
尝试
{
.
.
.
}
catch(WhichException e)//如果客户机发送了GET以外的动词,我在这里要捕获哪个异常?
{
Log(“无效的http动词!”);
}
}
.
.
.
}

当我尝试使用postman访问资源,并指定一个动词(如POST或PUT)时,我会得到一个HTTP 405响应,但我不确定在我的操作方法中捕获哪个异常以拦截非get请求。它不一定是通过引发异常来实现的,但任何其他记录非GET请求的方法也可以。

如注释中所述,如果您有一个Http.GET(webapi方法),并且您发送了一个帖子,那么该方法永远不会触发。 您可能缺少的是Http.Get是默认值

您可能还想回顾一下REST的基本理解

当控制器运行时,调用该方法的是方法“Type”(GET、POST、PUT、DELETE)和方法名(microsoft为您处理)的组合

因此,一个用
[HttpGet]
修饰的方法(或者因为没有应用属性…,而默认为HttpGet)永远不会为POST请求触发(从客户端发送)。因此,在WebApi世界中,“捕捉错误的方法”的概念是没有意义的

这里有一个更好的解决方案:

考虑编写一个ActionFilter

下面是一个简单的示例(显示Request.Method)(显然,对于非GET请求,您可以根据Request.Method进行筛选):

您可以将筛选器应用于:

方法

和/或

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

“全球”与


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

您可能还想回顾一下REST的基本理解

当控制器运行时,调用该方法的是方法“Type”(GET、POST、PUT、DELETE)和方法名(microsoft为您处理)的组合

因此,一个用
[HttpGet]
修饰的方法(或者因为没有应用属性…,而默认为HttpGet)永远不会为POST请求触发(从客户端发送)。因此,在WebApi世界中,“捕捉错误的方法”的概念是没有意义的

这里有一个更好的解决方案:

考虑编写一个ActionFilter

下面是一个简单的示例(显示Request.Method)(显然,对于非GET请求,您可以根据Request.Method进行筛选):

您可以将筛选器应用于:

方法

和/或

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

“全球”与


您不需要捕获异常。如果使用了另一个动词,您的GET服务将不会执行。我知道它不会执行,但我需要记录来自客户端的所有非GET请求。我该怎么做?Bruno.P是对的。我已经为记录请求添加了一个答案…如果您的“规则”是非Http.Get请求..则筛选非常简单。您不需要捕获异常。如果使用了另一个动词,您的GET服务将不会执行。我知道它不会执行,但我需要记录来自客户端的所有非GET请求。我该怎么做?Bruno.P是对的。我已经为记录请求添加了一个答案…如果您的“规则”是非Http.Get请求..过滤起来很简单。非常感谢您的想法,我现在正在尝试,将让您知道我是否能够成功捕获非Get请求只需再问一个问题-除了操作过滤器,您认为使用自定义消息处理程序也可以实现同样的效果吗?您可以在管道的前面添加自定义委派处理程序。CON这是一个“仅全局”的东西…也就是说,你不能把它缩小到一个单一的控制器或方法。你通常会加入一些“忽略这个绝对URI”的黑客来忽略某些请求。好的,我在API中有一些方法,我可以发送POST或put动词,但其他一些方法应该只接受GET动词。在这种情况下,自定义处理程序会阻止所有非GET请求吗,即使是对那些适合它们的方法?如果是的话,我可以为处理程序提供某种配置来排除那些URI吗?不知道。你必须证明它的概念。但是你现在有工具来做你需要的事情。非常感谢你的想法,我现在正在尝试,如果我能够成功捕获非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);
    }
}
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());
}