12

ASP.NET Web APIのルーティングベースクラスに軽微な違いがあることがわかりました。これにより、私は自分のルートを定義できる小さなヘルパークラスを作成するようになりました一度だけ。これには理由がありますか?私はこれが私を可能に何ASP.NET Web Apiルーティング(IISとSelf Hosted)

それは両方 RouteCollectionは同じ基本クラスから派生するか(このクラスは非常に簡単になるだろう)同じインターフェイスを実装させるためのフレームワークへの変更は大きすぎた
public static class RouteMapper 
{ 
    private class Route 
    { 
     public string Name { get; set; } 
     public string Template { get; set; } 
     public object Defaults { get; set; } 

     public Route(string name, string template, object defaults) 
     { 
      Name = name; 
      Template = template; 
      Defaults = defaults; 
     } 
    } 

    private static List<Route> GetRoutes() 
    { 
     return new List<Route> 
        { 
         new Route(
          "API Default", 
          "api/{controller}/{id}", 
          new {id = RouteParameter.Optional}) 
        }; 
    } 

    public static void AddHttpRoutes(this HttpRouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults)); 
    } 

    public static void AddHttpRoutes(this RouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults));    
    } 
} 

を想定しています私のGlobal.asaxと私の統合テストの両方で単純なAddHttpRoutesメソッドを呼び出すことです。

統合は、これは既知の問題であり、それはASP.NETのWeb APIを将来のリリースで修正される可能性がある

 var configuration = new HttpSelfHostConfiguration("http://localhost:20000"); 
     configuration.Routes.AddHttpRoutes(); 

     _server = new HttpSelfHostServer(configuration); 
     _server.OpenAsync().Wait(); 

Global.asaxの

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

     routes.AddHttpRoutes(); 

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

をテスト?

+0

このコード例では、元のRouteConfig.csファイル内にすべてのルーティングコードを保存するように少し修正しました。 – angularsen

答えて

4

はい、ルーティングはASP.NETがすでにルーティングを行っているために若干異なりますが、セルフホストのサポートを妨げるので直接ルーティングすることはできませんでした。私たちはまだ物事がより意味をなさない方法を見ています。

+0

共通のインターフェースを実装するために両者を変更した場合は、拡張メソッドを使用することができ、ルーティングは1箇所で行う必要があります。私がやったことに似ていますが、ただ一つの拡張メソッドが必要でした。私はあなたがそれよりずっと賢い何かを思い付くだろうと確信しています:) –

関連する問題