对ASP.NET Web API的所有请求都返回404错误

对ASP.NET Web API的所有请求都返回404错误,asp.net,.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,我有一个包含web API的ASP.NET MVC 4网站。该网站使用Visual Studio 2012和.NET 4.5在Windows 8上开发和测试,IIS Express作为web服务器在这种开发环境中,一切正常。 现在它部署在带有IIS 7.5的Windows 2008 R2(SP1)服务器上。NET 4.0和4.5已安装。应用程序池以集成管道模式运行.NET 4.0 在这种生产环境中,MVC网站可以工作,而web API不能。对于每个请求,无论GET或POST我都会收到404错误。

我有一个包含web API的ASP.NET MVC 4网站。该网站使用Visual Studio 2012和.NET 4.5在Windows 8上开发和测试,IIS Express作为web服务器在这种开发环境中,一切正常。

现在它部署在带有IIS 7.5的Windows 2008 R2(SP1)服务器上。NET 4.0和4.5已安装。应用程序池以集成管道模式运行.NET 4.0

在这种生产环境中,MVC网站可以工作,而web API不能。对于每个请求,无论GET或POST我都会收到404错误。如果我只是在浏览器中输入一个Web API Url(即在服务器上本地打开的9)来运行GET请求,我会得到一个404页面。如果我从Web API客户端应用程序发出POST请求,我也会收到一个404和消息:

未找到与请求URI匹配的HTTP资源

我已经用MVC 4和Web API创建了一个测试网站,并将其部署在同一台服务器上,Web API工作。Web API和MVC程序集在两个项目中的版本号相同

此外,我还向应用程序中添加了。如果我使用有效的路由,如
http://myserver/api/order/12
我得到以下结果:

对我来说,这意味着找到了正确的路由模板
Api/{Controller}/{Id}
,并将其正确解析为控制器
Order
Id=12
。控制器(源自
ApiController
)存在于web部件中,所有MVC控制器都位于该部件中

但是,我不知道状态
000
可能意味着什么,也不知道为什么没有显示“路线选择”部分(通常情况下,即使部件不包含单个
ApiController
,请参见上面链接页面上的屏幕截图)。不知何故,它看起来好像没有找到
ApiController
,甚至没有搜索,或者搜索无声地失败

IIS日志文件没有显示任何有用的内容。更改各种应用程序池设置,并使用相同的应用程序池进行测试和实际应用程序都没有帮助

我目前正在从应用程序中删除“功能”、配置设置、第三方程序集等,以便最终将其缩小到测试应用程序的小规模,并希望在某个时候开始工作

有人知道问题可能是什么吗?此外,任何可能找到原因的调试或日志想法都是非常受欢迎的

编辑

感谢Darrel Miller在下面评论中的提示,我已经整合了

对于(GET)请求URL
http://myserver/api/order/12
我得到以下信息:

  • 在开发环境中,成功(简称):
消息:
http://localhost:50020/api/order/12
;类别: System.Web.Http.Request

控制器选择和实例化…

操作员:默认HttpControllerSelector;操作:选择控制器; 消息:Route=“控制器:订单,id:12”;类别: System.Web.Http.Controllers

操作员:默认HttpControllerSelector;操作:选择控制器; 信息:订单;类别:System.Web.Http.Controller

操作员:HttpControllerDescriptor;操作:CreateController; 信息:;类别:System.Web.Http.Controller

操作员:DefaultHttpControllerActivator;操作:创建;信息: ; 类别:System.Web.Http.Controller

操作员:DefaultHttpControllerActivator;操作:创建;信息: MyApplication.ApicController.OrderController;类别: System.Web.Http.Controllers

操作选择、参数绑定和操作调用如下…

结果的内容协商和格式…

操作员:谈判代表;操作:谈判;消息:Typ=“String”。。。 更多

处理控制器…

操作员:订单控制员;操作:处置;信息:;类别: System.Web.Http.Controllers

  • 在生产环境中,未成功(缩写):
消息:
http://myserver/api/order/12
;类别: System.Web.Http.Request

操作员:默认HttpControllerSelector;操作:选择控制器; 消息:Route=“控制器:订单,id:12”;类别: System.Web.Http.Controllers

缺少控制器激活、操作选择、参数绑定、操作调用的整个部分,它遵循内容 立即协商并格式化错误消息

操作员:谈判代表;操作:谈判;信息: Type=“HttpError”。。。更多

多亏了来自的注释和源代码,我才发现生产服务器上缺少一个程序集(SQL Server Reporting Services的
ReportViewer 11程序集

尽管此程序集中没有
ApiController
,但似乎会导致程序集中的控制器(在本例中为我的Web项目的程序集中)找不到引用缺失程序集的控制器

显然,这种行为与源代码中的这段代码有关:

列表结果=新列表();
//检查应用程序引用的所有程序集
//并搜索与谓词匹配的类型
I收集
  • 编辑

    我已经发出了对CodePlex的改进请求:

    编辑2(2013年8月11日)


    WebAPI v5.0 RC解决了这个问题。有关详细信息,请参见上面指向workitem及其评论部分的链接。

    在这个答案中提供了大量资源,但是,我得到了404,这是一个非常愚蠢的原因:

  • 我为我的API创建了一个WiX安装程序
    List<Type> result = new List<Type>();
    
    // Go through all assemblies referenced by the application
    // and search for types matching a predicate
    ICollection<Assembly> assemblies = assembliesResolver.GetAssemblies();
    foreach (Assembly assembly in assemblies)
    {
        Type[] exportedTypes = null;
        if (assembly == null || assembly.IsDynamic)
        {
            // can't call GetExportedTypes on a dynamic assembly
            continue;
        }
    
        try
        {
            exportedTypes = assembly.GetExportedTypes();
        }
        catch (ReflectionTypeLoadException ex)
        {
            exportedTypes = ex.Types;
        }
        catch
        {
            // We deliberately ignore all exceptions when building the cache. If 
            // a controller type is not found then we will respond later with a 404.
            // However, until then we don't know whether an exception at all will
            // have an impact on finding a controller.
            continue;
        }
    
        if (exportedTypes != null)
        {
            result.AddRange(exportedTypes.Where(x => IsControllerTypePredicate(x)));
        }
    }
    
    <system.webServer>
        <modules>
            <remove name="UrlRoutingModule-4.0" />
            <add name="UrlRoutingModule-4.0" 
                type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
        </modules>
    </system.webServer>