2013-05-29 322 views
28

我有一个包含Web API的ASP.NET MVC 4网站。使用IIS Express作为Web服务器,在Windows 8上使用Visual Studio 2012和.NET 4.5开发和测试该网站。 在这个开发环境中一切正常。对ASP.NET Web API的所有请求都返回404错误

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

在这个生产环境下,MVC网站的工作原理是,Web API没有。对于每个请求,无论GET还是POST,我都会收到404错误。如果我只是在浏览器(在服务器本地打开IE 9)中输入一个Web API Url来运行一个GET请求,我会得到一个404页面。如果我发出了从Web API客户端应用程序POST请求,我收到了404,以及与消息:

我创建了一个

没有HTTP资源发现,请求匹配URI使用MVC 4和Web API测试网站,并将其部署在同一台服务器上,并且Web API可以工作。 Web API和MVC程序集在两个项目中都具有相同的版本号。

此外,我已将Web API Route Debugger添加到应用程序中。如果我使用一个有效的路由像http://myserver/api/order/12我得到以下结果:

Route Debugger

对于我来说,这意味着正确的路由模板Api/{Controller}/{Id}已发现并正确地解析为控制器OrderId=12。控制器(来自ApiController)存在于所有MVC控制器所在的Web组件中。

不过,我不知道是什么状态000可能意味着以及为什么没有显示“路径选择”一节(这通常是这种情况,即使集不包含单ApiController是,见截图上面的链接页面)。不知何故,它看起来像没有找到ApiController甚至没有搜索或搜索失败的默默。

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

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

有人知道问题可能是什么吗?另外任何调试或记录的想法可能找到原因是非常受欢迎的。

编辑

由于达雷尔 - 米勒在我下面的评论尖端集成了Tracing for ASP.NET Web Api

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

  • 在开发环境中,成功的(缩略形式):

消息:http://localhost:50020/api/order/12;类别: System.Web.Http.Request

控制器的选择和实例...

运营商:DefaultHttpControllerSelector;操作:SelectController; 消息:Route =“controller:order,id:12”;类别: System.Web.Http.Controllers

运算符:DefaultHttpControllerSelector;操作:SelectController; 消息:订购;类别:System.Web.Http.Controllers

运算符:HttpControllerDescriptor;操作:CreateController; 消息:;类别:System.Web.Http.Controllers

运算符:DefaultHttpControllerActivator;操作:创建;讯息: ;类别:System.Web.Http.Controllers

运算符:DefaultHttpControllerActivator;操作:创建;消息: MyApplication.ApiControllers.OrderController;类别: System.Web.Http.Controllers

行动选择,参数绑定和调用动作如下...

内容协商和格式结果...

运营商:DefaultContentNegotiator ;操作:协商;消息:典型值= “字符串” ... 更多

处置控制器...

运营商:OrderController;操作:处理;信息: ;分类: System.Web.Http.Controllers

  • 在生产环境中,未成功(在短形式):

消息:http://myserver/api/order/12;类别: System.Web.Http.Request

运算符:DefaultHttpControllerSelector;操作:SelectController; 消息:Route =“controller:order,id:12”;分类: System.Web.Http。控制器

控制器激活,动作选择,参数绑定,调用行动失踪,它遵循内容 谈判,并立即格式化的错误消息的整个部分:

运营商:DefaultContentNegotiator;操作:协商;消息: TYPE =“HttpError” ... 更多

+0

您可能需要激活服务器角色>互联网信息服务>万维网服务一些IIS功能。 我不知道你需要激活什么,但我认为你的问题可以在这里! –

+1

尝试打开网页API跟踪http://www.asp.net/web-api/overview/testing-and-debugging/tracing-in-aspnet-web-api –

+0

看起来像你的WebAPI未注册。你的'Global.asax'和'WebApiConfig'是怎么回事?它们内部是否有条件配置? – Liel

回答

23

由于从this answerKiran Challa's评论和源代码我能弄清楚,一个组件(该ReportViewer 11 assembly用于SQL Server报表服务)是失踪生产服务器。

虽然在此程序集中没有ApiController,但似乎导致未找到引用缺失程序集的程序集中的控制器 - 在本例中为我的Web项目的程序集。

显然,这种行为是从Web API's DefaultHttpControllerTypeResolver源有关这段代码:

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))); 
    } 
} 

我不知道,如果它必须是这样的,我不是在代码中的注释很相信但这catch ... continue块是相当沉默可能出现的问题和我花了大量的时间和挫折量找到它。我甚至知道,ReportViewer尚未安装。我试图安装它,依赖的组件,但它被封锁的服务器上的其他正在运行的进程,所以我决定推迟安装,直到我可以联系管理员,并专注于MVC和的WebAPI测试第一 - 大错!如果没有Kiran的调试代码片段我从未有过一个ReportViewer.dll的存在能有什么用控制器类型分辨率的想法。

在我看来还有改进的余地对于普通开发者像我这样谁没有关于Web API的内部运作有较深造诣。

安装缺少ReportViewer.dll问题就消失了。

以下是大致相同的症状问题,这可能有同样的原因:

编辑

我已经发布在CodePlex上改进的请求:

http://aspnetwebstack.codeplex.com/workitem/1075

编辑2(8月11日'13)

问题已固定的WebAPI V5.0 RC。有关详细信息,请参阅上述链接至工作项目及其评论部分。

+1

你在哪里找到这个大会?我只看到webforms的东西。 –

+1

@RaySülzer:它是* my *项目的一部分。如果你不使用SSRS,你的项目中就不会有这个程序集。 – Slauma

+0

谢谢你,你救了我的一天 – Benny

5

大资源,在这个答案,但是,我得到一个404什么竟然是一个非常愚蠢的理由:

  1. 我创建了一个WiX的安装程序为我的API项目
  2. 它安装在一个测试VM(虚拟机)
  3. 要求为一个URI的API应该成为
  4. BANG! 404 :(

原来,我已经错过了包装,并在我的部署部署的Global.asax到虚拟目录的根目录。这里加入此为goofies的像我这样的好处:)

+0

最后一句话对我来说是一条线索,我在发布时检查“预先编译...”的工作,并且它像我的本地服务器一样工作。 –

0

我在远程服务器有同样的问题,但是当我在本地主机上执行时工作正常。

我的解决办法是:

<system.webServer> 
    <modules> 
     <remove name="UrlRoutingModule-4.0" /> 
     <add name="UrlRoutingModule-4.0" 
      type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
    </modules> 
</system.webServer> 

我希望,这对你的作品。