【问题标题】:Using a route to return 408 on a specific file name request使用路由在特定文件名请求上返回 408
【发布时间】:2018-02-17 11:55:39
【问题描述】:

我们遇到了一个问题,即 Outlook 行为异常,因为它试图读取我们域上的 autodiscover.xml,特别是 https://example.com/autodiscover/autodiscover.xml

电子邮件主机说我们应该配置网站防火墙以返回超时错误。但是,该站点托管在 Azure 上,我没有看到任何选项。

因此,我想知道这是否可以在 MVC 中完成?我尝试了以下方法:

public class AutoDiscoverController : Controller
{
    [Route("autodiscover/autodiscover.xml")]
    public ActionResult Index()
    {
        return new HttpStatusCodeResult(HttpStatusCode.RequestTimeout);
    }
}

...但它不起作用;我看到的是 404 页面。方法上的断点也永远不会被命中。

是否可以创建一个模仿不存在文件的路由来返回超时错误?

重复问题更新

Dots in URL causes 404 with ASP.NET mvc and IIS 也有类似的问题。但是,这个问题的不同之处在于:

  • 答案在 MVC5 中不起作用
  • 我无法创建规则来识别 URL 中的尾部斜杠,因为 Outlook 正在生成 URL,而我无法控制它

我还尝试了什么...

  1. 在 RouteConfig 中,我定义了一个自定义路由。它不起作用;路线永远不会被击中。

    routes.MapRoute(
                name: "AutoDiscover",
                url: "autodiscover/autodiscover.xml",
                defaults: new { controller = "AutoDiscover", action = "Index" });
    
  2. 同上,但使用url: "autodiscover/*"

  3. routes.IgnoreRoute("autodiscover.xml");

  4. 在控制器本身上定义一个Route属性,然后启用routes.MapMvcAttributeRoutes();

【问题讨论】:

  • 你能把你的交换服务器的IP列入黑名单吗?
  • @NightOwl888 没问题,谢谢。我完成了那个答案并在上面提供了更新
  • @EvilDr 您正在使用属性路由,但我没有看到任何迹象表明您启用了它routes.MapMvcAttributeRoutes();。确保它在基于约定的路由之前注册。
  • @Nkosi 谢谢。我添加了它,但路由/控制器仍然没有被命中

标签: asp.net-mvc asp.net-mvc-5 routes


【解决方案1】:

感谢 Rick Strahl 的 answer hererelated blog post,我找到了答案。

出于某种原因,在 RouteConfig 中定义路由永远不会成功,但在控制器级别执行它确实工作。但是,正如 Nkosi 指出的那样,需要一个额外的步骤才能使其正常工作。

1。启用 MVC 属性路由

这会在控制器级别连接路由属性(在下一步中完成)

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes(); // <-- Added this

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

2。将 Route 添加为属性

public class AutoDiscoverController : Controller
{
    [Route("autodiscover/autodiscover.xml")]
    public ActionResult Index()
    {
        return new HttpStatusCodeResult(HttpStatusCode.RequestTimeout);
    }
}

3。根据 web.config 中的特定文件配置路由

我相信这会迫使 MVC 接管 IIS 通常处理的内容(因为 XML 被视为 “静态” 文件)。

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition="" />

    <!-- Added this line -->
    <add name="AutoDiscoverXmlFileHandler" path="autodiscover.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />

  </handlers>
</system.webServer>

结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2018-08-05
    • 2017-05-13
    • 1970-01-01
    • 2019-09-28
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多