【问题标题】:Elmah.axd on WebAPI 2.2 - No HTTP Resource was foundWebAPI 2.2 上的 Elmah.axd - 未找到 HTTP 资源
【发布时间】:2015-09-08 08:19:07
【问题描述】:

我试图在我的浏览器中访问 /elmah.axd,但它返回:

{"message":"No HTTP resource was found that matches the request URI 'http://services.domain.com/elmah.axd'."}

服务器是本地的 (127.0.0.1),甚至我有我的 web.config Elmah 设置来保护它:

<elmah>
    <security allowRemoteAccess="true" />
</elmah>

我的 WebApiConfig 看起来像:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Locally only you will be able to see the exception errors
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly;

            // Web API routes
            config.Routes.IgnoreRoute("elmah", "elmah.axd");
            config.Routes.IgnoreRoute("allemah", "elmah.axd/{*pathInfo}");
            config.Routes.IgnoreRoute("elmahgeneric", "{resource}.axd/{*everything}");
            config.MapHttpAttributeRoutes();

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            // Remove the XML formatter
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

我什至尝试从 3 种组合中的任何一种中一次只忽略一条路线,但没有运气。

最后我的 global.asax 看起来像这样:

protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

        }

任何关于我可能遗漏的提示或想法都会很好。

在此先感谢,非常感谢您花时间研究此问题。

【问题讨论】:

    标签: asp.net-web-api asp.net-web-api2 elmah asp.net-web-api-routing


    【解决方案1】:

    我终于成功了。

    通过添加到 WebApiConfig.cs 文件

    config.Routes.MapHttpRoute("AXD", "{resource}.axd/{*pathInfo}", null, null, new StopRoutingHandler());
    

    WebApiConfig.cs 文件的整个代码如下所示:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
                // Locally only you will be able to see the exception errors
                config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly;
    
                // Web API routes
                config.MapHttpAttributeRoutes();
    
                var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
                jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    
                // Remove the XML formatter
                config.Formatters.Remove(config.Formatters.XmlFormatter);
    
                config.Routes.MapHttpRoute("AXD", "{resource}.axd/{*pathInfo}", null, null, new StopRoutingHandler());
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
    
    
        }
    

    最后的改变是在 application_start 方法下将这个添加到 global.asax

    RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
    

    特别感谢所有帮助我解决这个问题的人。

    【讨论】:

    • 终于找到了这个奇怪问题的真正答案,感谢@acido
    • 这对我有用,但我只需要 Applicaiton_Start 中的RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
    【解决方案2】:

    当我在 application_start 方法下的 global.asax 中添加以下内容时:

    RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
    

    直到我把它放在上面才起作用......

    GlobalConfiguration.Configure(WebApiConfig.Register);
    

    添加到 Routes 属性的路由顺序很重要,因为应用程序使用集合中与 URL 匹配的第一个路由。

    https://msdn.microsoft.com/en-us/library/system.web.routing.routetable.routes(v=vs.110).aspx

    【讨论】:

      【解决方案3】:

      最可能的问题是缺少生成错误页面的处理程序。

      确保在您的web.config 文件中配置了以下处理程序:

      <system.web>
          ...
          <httpHandlers>
            ...
            <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
          </httpHandlers>
      
      
      <system.webServer>
          ...
          <handlers>
            ...
            <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
          </handlers>
      

      通过这些设置,您应该能够访问elmah.axd 并按预期保护它。

      您可以在此处获取从新项目更新的示例配置文件作为示例:https://brutaldev.com/download/30987439.zip

      【讨论】:

      • 我发现我需要将 Elmah 处理程序移动到处理程序列表中的第一个条目。
      【解决方案4】:

      为我添加

      config.Routes.IgnoreRoute("axd", "{resource}.axd/{*pathInfo}");
      

      WebApiConfig 就够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-05
        • 2019-11-26
        • 1970-01-01
        • 2018-09-02
        • 2016-01-26
        • 2017-12-23
        • 2016-07-13
        • 1970-01-01
        相关资源
        最近更新 更多