我的操作方法设置为仅接受 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());
}