Asp.net web api 如何将非GET请求记录到操作方法?
我的操作方法设置为仅接受GET请求。如果向其发送GET以外的谓词,则会将“HTTP 405 Method not allowed”响应发送回客户端。但我需要在每次发送GET以外的动词时记录它。我目前尝试的方法是,尝试引发一个异常(我不知道要捕获哪个异常),然后在catch块内进行日志记录。我的行动方法如下: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
[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());
}