簡體   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