Asp.net web api Web.API在某些部署中工作,但在其他部署中返回404

Asp.net web api Web.API在某些部署中工作,但在其他部署中返回404,asp.net-web-api,asp.net-web-api-routing,Asp.net Web Api,Asp.net Web Api Routing,我有一个广泛分布的ASP.NET WebForms应用程序。我的新版本添加了Web.API,用户一直在玩beta版。在大多数测试版安装中,一切正常,但对于某些安装,所有Web.API调用都返回HTTP 404 Not Found错误。我不明白为什么Web.API调用在某些服务器上失败,但在其他服务器上却可以正常工作 我猜有某种服务器配置破坏了路由,但我不知道它是什么。我甚至对其中一个网站进行了RDP,但找不到任何明显的东西 这是一个示例API调用: 得到 守则: namespace Galler

我有一个广泛分布的ASP.NET WebForms应用程序。我的新版本添加了Web.API,用户一直在玩beta版。在大多数测试版安装中,一切正常,但对于某些安装,所有Web.API调用都返回HTTP 404 Not Found错误。我不明白为什么Web.API调用在某些服务器上失败,但在其他服务器上却可以正常工作

我猜有某种服务器配置破坏了路由,但我不知道它是什么。我甚至对其中一个网站进行了RDP,但找不到任何明显的东西

这是一个示例API调用:

得到

守则:

namespace GalleryServerPro.Web.Api
{
  public class EventsController : ApiController
  {
    public string Get(int id)
    {
      return "Event data for ID " + id;
    }
  }
}
从名为GspHttpApplication的自定义HTTP模块的Init事件调用的路由定义:

private void RegisterRoutes(RouteCollection routes)
{
  routes.MapHttpRoute(
    name: "GalleryApi1",
    routeTemplate: "api/{controller}"
  );

  routes.MapHttpRoute(
    name: "GalleryApi2",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { },
    constraints: new
    {
      id = @"\d*",
    }
  );

  routes.MapHttpRoute(
    name: "GalleryApi3",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new
    {
    },
    constraints: new
    {
      id = @"\d*"
    }
  );

  // Add route to support things like api/meta/galleryitems/
  routes.MapHttpRoute(
    name: "GalleryApi4",
    routeTemplate: "api/{controller}/{action}",
    defaults: new
    {
    },
    constraints: new
    {
    }
  );
}
上面的示例GET应该匹配名为GalleryApi2的路由,就像我在大多数安装中所说的那样

我知道WebDAV会导致405错误,所以我已经在web.config中删除了它:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
    <add name="GspApp" type="GalleryServerPro.Web.HttpModule.GspHttpApplication, GalleryServerPro.Web" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
  ...
</system.webServer>
因此,归根结底,我们要弄清楚为什么这种配置适用于某些web安装,而不适用于其他web安装


罗杰

你有什么理由在经典模式下运行这些吗?你能检查成功的和失败的两台机器是否以相同的模式运行应用程序吗?顺便说一句:这些路线不应该从最具体的一条开始订购吗?我是在综合模式下运行的,不是经典模式。虽然你的排序可能是对的,但这并不能解释我得到的404。忽略前面的评论-我以为你只为其中一种模式配置了配置,但我没有阅读整个配置