繁体   English   中英

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

[英]All requests to ASP.NET Web API return 404 error

我有一个包含Web API的ASP.NET MVC 4网站。 该站点在Windows 8上使用Visual Studio 2012和.NET 4.5进行开发和测试,其中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(在服务器上本地打开IE 9)来运行GET请求,我会得到一个404页面。 如果我从Web API客户端应用程序发出POST请求,我也会收到404消息:

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

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

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

路由调试器

对我来说,这意味着找到了正确的路径模板Api/{Controller}/{Id}并将其正确解析为控制器OrderId=12 控制器(派生自ApiController )存在于Web程序集中,其中所有MVC控制器也是如此。

但是,我不知道状态000可能意味着什么以及为什么没有显示“ ApiController选择”部分(通常情况下,即使程序集不包含单个ApiController ,请参见上面链接页面上的屏幕截图) 。 不知怎的,它看起来没有找到甚至没有找到ApiController ,或者搜索失败了。

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

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

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

编辑

感谢Darrel Miller在下面评论中的提示,我已经集成了针对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; 操作:谈判; 消息:Typ =“String”... 更多

处理控制器......

运算符:OrderController; 操作:处理; 信息: ; 类别:System.Web.Http.Controllers

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

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

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

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

运算符:DefaultContentNegotiator; 操作:谈判; 消息:Type =“HttpError”... 更多

感谢Kiran Challa的评论和来自此答案的源代码,我能够发现生产服务器上缺少一个程序集(SQL Server Reporting Services的ReportViewer 11 assembly )。

虽然这个程序ApiController没有ApiController ,但它似乎导致找不到程序ApiController控制器 - 在这种情况下是我的Web项目的程序集 - 引用了缺少的程序集。

显然,这种行为与Web API的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(2013年8月11日)

WebAPI v5.0 RC已修复此问题。 有关详细信息,请参阅上面的工作项链接及其注释部分。

然而,在这个答案中有很好的资源,我得到了404,结果是一个非常愚蠢的原因:

  1. 我为我的API项目创建了一个WiX安装程序
  2. 将其安装在测试VM(虚拟机)上
  3. 请求API应该提供的URI
  4. 砰! 404 :(

事实证明,我错过了打包并将Global.asax部署到部署中虚拟目录的根目录。 在这里添加这个为了像我这样的傻瓜的好处:)

我在远程服务器上遇到了同样的问题,但是当我在localhost上执行时工作正常。

我的解决方案是:

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

我希望,这对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM