2013-05-29 336 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> 

我希望,這對你的作品。