2014-03-01 85 views
4

由於各種工程需求,我需要在同一個應用程序域中開發一個新的ASP.NET Web API應用程序(命名爲BarApp)現有的應用程序(名爲FooApp)。將ASP.NET Web API應用程序配置爲ASP.NET MVC應用程序下的虛擬目錄

我想在ASP.NET 8.5上的現有ASP.NET MVC應用程序(FooApp)下將ASP.NET Web API應用程序(BarApp)配置爲虛擬目錄。雖然許多帖子都談到如何配置虛擬目錄,但它們都不起作用。

下面是配置片段

 <site name="FooApp" id="3" serverAutoStart="true"> 
      <application path="/" applicationPool="FooApp"> 
       <virtualDirectory path="/" physicalPath="E:\FooApp" /> 
       <virtualDirectory path="/Bar" physicalPath="E:\BarApp" /> 
      </application> 
      <bindings> 
       <binding protocol="https" bindingInformation="*:34566:" sslFlags="0" /> 
      </bindings> 
     </site> 

這裏是網站結構:

-FooApp 
| 
|--Bin 
|--View 
|--Bar (as a virtual directory) 
    | 
    |--Bin 
    |--View 

在富應用程序,我配置的路由:添加則會忽略路線爲所有路徑酒吧

--RouteConfig.cs 
    namespace FooApp 
    { 
     public class RouteConfig 
     { 
      public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("{*path}", new { path = @"Bar\/(.*)" }); 

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

--WebApiConfig,保留自動生成的。

namespace FooApp 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
      } 
    } 
} 

在BarApp,路由配置修改爲:

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

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

--WebApiConfig 
namespace BarApp 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "Bar/api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
     } 
    } 
} 

然而,上述結構中不工作,並且忽略路徑似乎不考慮效果。
無法訪問Bar的頁面:https://mywebsite.test.com:4433/Bar/ HTTP錯誤403.14 - 禁止 Web服務器配置爲不列出此目錄的內容。

無法訪問欄的網頁API:https://mywebsite.test.com:4433/Bar/api/values HTTP錯誤404.0 - 找不到 您正在尋找已被刪除的資源,有其名稱更改,或者暫時不可用。

網絡API庫2.2.1

回答

3

我使用的配置文件(只能通過IIS和發佈)未安裝虛擬應用程序,但我相信,您所遇到的問題是路由URL是如何理解映射在虛擬應用程序中。對於以下內容,我們假設您的FooApp將DNS設置爲fooapp(http://fooapp/)。

如果您在fooapp下有Bar虛擬應用程序,Bar網站的根目錄將爲http://fooapp/Bar。如果我們看一下你的路由定義(MVC和的WebAPI):

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

// WebApi Route 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "Bar/api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

兩個你的路由設置爲監聽運行的應用程序下Bar「目錄」。如果我們自己發佈的WebApi應用程序(比如說在本地主機上),這將是http://localhost/Bar。但你實際上是在http://fooapp/Bar下,它將捕獲基於該根路徑的請求,該請求將是http://fooapp/Bar/Bar(因此http://fooapp/Bar/Bar/api/values等)。

只要忽略路由,如果沒有控制器處理/Bar中的路由FooApp,應用程序將告訴IIS它不知道如何處理請求,然後IIS將移動到其他處理程序(靜態文件處理程序,等等)。讓我們以您的請求爲例(https://mywebsite.test.com:4433/Bar/)。由於它在虛擬應用程序下,它會詢問Bar應用程序是否可以處理/路線。由於Bar應用程序中的路由定義僅處理/Bar/{tokens},它將默認爲靜態文件處理程序(在本例中爲目錄瀏覽)並由於配置而返回403。

如果你把你的第二個例子(https://mywebsite.test.com:4433/Bar/api/values),它會問Bar應用程序是否能處理/api/values它不能(記住,它可以處理/Bar/api/values,不/api/values)。由於您的應用程序不能,它會回到其他處理程序,並且沒有人能夠滿足請求並返回一個404.

+1

西門,非常感謝您的探測分析。但是,我嘗試使用configure:在Bar App中,MVC路由更改爲「url:」{controller}/{action}/{id}「,」,Web API路由更改爲「routeTemplate:」 API/{控制器} /(編號) 「」。對https://mywebsite.test.com:4433/Bar/api/values的請求仍然返回404.請注意,Bar應用程序具有ValuesController來處理對api/values的獲取請求。你有任何其他想法來找出原因嗎?謝謝! –

+0

從跟蹤日誌,我確實看到GENERAL_CHILD_REQUEST_START活動,詳情如下: SITEID:6 RequestURL:https://開頭本地主機:4433 /酒吧/ API /值 RequestVerb:GET RecursiveLevel:1 但GENERAL_CHILD_REQUEST_END事件返回404錯誤。 –

+0

請有人給微軟打電話來解決這個問題。我現在不得不恢復到頁面方法,直到我可以得到這個工作 – ojorma

0

我有同樣的問題。解決方案很簡單:在MVCRouteConfiguration中,您需要到子虛擬應用程序的路由(如果您在foo下有酒吧,foo需要知道酒吧路線)。

對於酒吧應用程序,您需要Simon記錄的路線!

親切的問候

塔拉

相關問題