2012-05-01 59 views
0

我有一個ASP.NET MVC框架路由問題,它採用我需要的HttpHandler通過其默認路由的URL路由,反之亦然:使用RouteTable將所有「/ api」請求路由到ASP.NET MVC中的HttpHandler

routes.MapRouteLowercase(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional });// Parameter defaults 

我試圖忽視的路線,我需要:

routes.IgnoreRoute("api/{*pathInfo}"); 

如果我加入了MVC的路線前添加到RouteTable,所有的MVC路線最終指向我「/ api」路線。

如果我將它們添加後,路由在路由表中但無法識別。我試過使用RouteDebugger,它顯示我的路線爲匹配,但它們從來沒有被調用過。

來源是this micro REST framework我正在寫,如果有幫助。

+0

我已經試過這也:http://stackoverflow.com/questions/5942452 /無法映射到一個httphandler到一個路徑通配符映射,但沒有運氣 –

回答

0

我已經找到了解決方法,但它並不能解釋爲什麼我的路線在MVC路線中嘰嘰喳喳時,根本就沒有以「api /」開頭。

周圍的工作我使用的是一個約束添加到我的路線,檢查它是否是一個URL生成,而忽略它,如果它的MVC數據傳遞:

// Constrain HTTP method, and an extra constraint so MVC urls aren't swallowed. 
route.Constraints = new RouteValueDictionary(); 
route.Constraints.Add("httpMethod", new HttpMethodConstraint(new string[] { restAttribute.Method })); 
route.Constraints.Add("MvcContraint", new IgnoreMvcConstraint()); 

RouteTable.Routes.Add(route); 

的限制:

public class IgnoreMvcConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (routeDirection == RouteDirection.UrlGeneration) 
      return false; 
     if (values.ContainsKey("controller") || values.ContainsKey("action")) 
      return false; 

     if (route.Url.StartsWith(RestHttpHandler._baseUrl)) 
      return true; 
     else 
      return false; 
    } 
} 
1

你需要MVC框架來爲你做路由嗎?

如果沒有,看看這篇文章:Basic Routing for HttpHandler

這是一個很好的選擇,如果你需要的東西快速和簡單;)

+0

謝謝,但我已經使用一個httphandler –

相關問題