为什么HTTP HEAD请求没有被routes.MapRoutes()捕获而HTTP GET被捕获?

本文关键字:HTTP GET routes 请求 HEAD 为什么 MapRoutes | 更新日期: 2023-09-27 18:06:16

我有一个。net控制器来处理图像请求。

web上有一个URL重写规则。配置转换http://localhost/images/1809x1280/image1.jpgto http://localhost/image/get/image1.jpg/1809/1280

然后我有以下RouteConfig规则

    routes.MapRoute()
        name: "Images",
        url: "image/get/{filename}/{width}/{height}",
        defaults: new { controller = "Image", action = "Get" }
    );

当我执行HTTP GET请求时,该操作被正确路由到正确的控件,并且我得到预期的HTTP/1.1 200 OK响应,但是当我将HTTP动词从GET更改为HEAD时,我收到HTTP/1.1 404 Not Found响应。

在我的ImageController.Get()方法中放置了一个断点,我注意到只有HTTP GET请求击中了它。

然后在Global.asax.csApplication_BeginRequest中放置一个断点,HTTP GETHTTP HEAD请求都命中该断点。

当请求是HTTP HEAD时,我有Request对象的以下属性:

RawUrl "/images/1809x1280/image1.jpg" string

Url {http://localhost/image/get/image1.jpg/1809/1280} System.Uri

,这是正确的,并且表明web.config重写规则已经启动,但是ImageController.Get()从未被击中。

这似乎是routes.MapRoute()在这一点上的一个问题,但我不知道如何去调查它。

为什么HTTP HEAD请求没有被routes.MapRoutes()捕获而HTTP GET被捕获?

显然比我想象的要简单。

我到处看,除了看我的控制器动作,它只装饰了[HttpGet]属性,用下面的替换已经修复了它:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]
public ActionResult Get(string imageName){
...
}