2014-01-29 112 views
2

我最近將Visual Studio升級到2013,現在默認情況下只使用IIS Express(而不是Cassini),並且發現我不能再打我的WCF服務了javascript端點:Myservice.svc/js或/ jsdebug,但直接點擊.svc會正常工作。WCF + MVC + WebAPI處理程序和路由

我發現,如果我刪除我的web.config(其中包含一些ExtensionlessUrlHandler項目)的<處理程序>部分,則會恢復腳本端點的功能。我很好奇除去下列項目會產生什麼影響,以及是否有其他解決方案。

這是我從我的Web.config文件刪除塊:

<handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 

有些情況下,我使用.NET 4.5,MVC 5.1的WebAPI V2.1和WCF都在同一個項目中。基本上是所有組件的最新版本。

更新1: 我也注意到,所有的WebAPI PUT的都回來了,與這些處理器去掉404;所以有些東西顯然缺失。另一個小小的頓悟是,當部署到活動服務器(IIS 7.5 [7.5.7600.16385版))時,一切都很好。因此,Visual Studio 2013集成版本的IIS Express和完整的IIS 7.5安裝程序的路由或處理程序映射必須有所不同。

此外,如果我創建一個全新的ASP.NET Web應用程序並添加一個WCF服務,一切工作正常本地。如果我然後添加一個WebAPI控制器,下面的處理程序部分被添加到web.config並打破所有的WCF調用。當MVC,WCF和WebAPI都是一個應用程序的一部分時,這聽起來更像是微軟默認配置中的一個'bug'。

更新2: 這裏有一個基本的測試用例,任何人都可以重現我遇到的錯誤。

過程重新基地問題: (的WebAPI工作,WCF * .SVC/JS導致404)

  1. 新建項目 - > Asp.NET Web應用程序,使用Web API模板(包括MVC和Web API參考)
  2. 添加新的「WCF服務(支持Ajax)項目名爲root 「TestService的」
  3. 啓動項目。
  4. 驗證/幫助路工程MVC(呈現幫助頁)
  5. 驗證GET/API /值的WebAPI(返回值)/ 1作品
  6. *驗證PUT/API /價值/ 1作品的WebAPI(沒有返回 - 空法)*
  7. 驗證TestService的。 svc可以擊中WCF(顯示元數據頁面)
  8. *驗證TestService.svc/js FAILS與404爲WCF - 路由問題!*

部分修復: (PUT的WebAPI打破,WCF可以使JS請求)

  1. 從上面繼續...
  2. 更新Web.config文件,並註釋掉<處理>部分
  3. 啓動項目。
  4. 驗證/幫助路工程MVC(呈現幫助頁)
  5. 驗證GET/API /價值/ 1作品的WebAPI(返回值)
  6. *驗證PUT/API /價值/ 1失敗與404A WebApi - 路由問題! *
  7. 驗證TestService.svc可以命中WCF(元數據顯示頁)
  8. *驗證TestService.svc/JS渲染所需的JavaScript的WCF *
+0

IIS Express並沒有真正執行IIS行爲的正確再現,也沒有爲替代方案提供許多好處。使用ASP.NET開發服務器會發生什麼? – CodeCaster

+0

我沒有單獨安裝IIS Express,只是Visual Studio默認安裝/運行的一個。 – bmherold

+0

我明白,但你可以改變你的項目屬性。 – CodeCaster

回答

3

這實際上是一個MVC路由問題。請修改你的〜/ App_Start/RouteConfig.cs如下。您需要保持ExtensionlessUrlHandler以使mvc路由在無擴展名的URL上正常運行。

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     //This line is the addition. 
     routes.IgnoreRoute("{resource}.svc/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 
+0

嗯,在我的RouteConfig開始時,我確實有這條線,並且在處理程序到位時,我的* .svc/js仍然是404。另外,隨着處理程序的移除,我也注意到任何WebAPI PUT都會以404的形式返回;所以我想你是錯的。 – bmherold

+1

你可以發佈一個使用web api的例子嗎?你使用屬性路由嗎?我試圖重新表達你的情況。基於你的問題的第一個編輯,我添加了一個簡單的get方法的web api控制器,一切仍然適用於我。 –

+0

感謝Kenneth - 我在上面用我在一個空白項目上使用的確切步驟重新創建了我的問題添加了「Update 2」。我使用Windows 8.1和Visual Studio 2013以及內置的IIS Express,並且僅顯示了步驟。 – bmherold