簡體   English   中英

WCF + MVC + WebAPI處理程序和路由

[英]WCF + MVC + WebAPI handlers and routing

我最近將Visual Studio升級到了2013,現在默認情況下現在僅使用IIS Express(而不是Cassini),發現我無法再擊中WCF服務的javascript端點:Myservice.svc / js或/ jsdebug,但是直接擊中.svc即可精細。

我發現如果刪除web.config的<handlers>部分(其中包括一些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都屬於一個應用程序時,這聽起來更像是Microsoft默認配置中的“錯誤”。

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

重新創建基本問題的過程: (WebAPI運行,WCF * .svc / js生成404)

  1. 新建項目-> Asp.NET Web應用程序,使用Web API模板(包括MVC和Web API引用)
  2. 向名為“ TestService”的項目根目錄添加新的“ WCF服務(啟用了ajax)”
  3. 啟動項目。
  4. 驗證/ help路由是否適用於MVC(提供幫助頁面)
  5. 驗證GET / api / values / 1是否適用於WebApi(返回值)
  6. *確認PUT / api / values / 1適用於WebApi(不返回任何內容-void方法)*
  7. 驗證可以為WCF命中TestService.svc(顯示元數據頁面)
  8. *驗證TestService.svc / js是否為404 for WCF失敗-路由問題! *

部分修復: (WebAPI PUT損壞,WCF可以呈現JS請求)

  1. 從上方繼續...
  2. 更新Web.config並注釋掉<handlers>部分
  3. 啟動項目。
  4. 驗證/ help路由是否適用於MVC(提供幫助頁面)
  5. 驗證GET / api / values / 1是否適用於WebApi(返回值)
  6. *使用WebApi的404驗證PUT / api / values / 1失敗-路由問題! *
  7. 驗證可以為WCF命中TestService.svc(顯示元數據頁面)
  8. *確認TestService.svc / js呈現了WCF所需的JavaScript *

這實際上是一個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 }
        );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM