2016-08-01 6 views
0

ウェブAPI 2でサポートされているアプリケーションの開発を開始しました。これは、RESTfulな方法でデータを取得したかったからです。ウェブAPIルートとmvcルートを区別する

次に、管理者が提供された情報を管理できるように、サイトにHTMLを追加する必要があったため、MVC 5コントローラーでHTMLを返すように作成しました。今は、Web APIルートとMVCルートを区別し、可能であれば、運用中のWeb APIルートに影響を与えることはありません。

ウェブAPIルート:デフォルトルーティング:ここに衝突今

public static void Register(HttpConfiguration config) 
{ 
    // Web API routes 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "{controller}/{action}/{id}", 
     defaults: 
      new { 
       controller = "Parking", 
       action = "Get", 
       id = RouteParameter.Optional 
       } 
     ); 
} 

MVCのルートを解決しているだろう、私が最初にこれを開発した「API」プレフィックスを、削除された私のミス。 MVCコントローラ名はつまり、MVCルートが唯一

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

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

問題は、MVCのルートはWebAPIのルートが最初に一致するので、一致する機会を持っていないということである投与部位のために意図され、管理されます。 の作業がまだ稼働していないため、MVCルートを変更する必要はありません。 ウェブAPIルートをそのまま保つ方が良いでしょう。

私が試した:MVCコントローラ用の接頭辞として「ウェブ」が、ルーティングを使用してWeb APIルートの登録とGlobal.asax.cs

  • におけるMVCのルートの順序を切り替える

    • をメカニズムは "web"がコントローラであり、それが見つからないと思っています(Web APIのルーティングが再び勝つ)。
    • 私はこの衝突を回避するための適切な制約を思い付くことができませんでした。
    • ハードコード「管理」は、MVCルートパターンの「{コントローラ}」を置き換えます。

    ここでは、衝突を解決するためのいくつかのトリックがありますか?

  • +0

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{action}/{id}", defaults: new { controller = "Parking", action = "Get", id = RouteParameter.Optional }, constraints: new { controller = @"(?!web).*" } ); } } 

    そして、私のRouteConfig:だから

    constraints: new { controller = @"(?!web).*" } 

    、これは私のWebApiConfigですウェブAPIのために通常行われる処理。 web apiは通常、衝突を避けるために 'api'プレフィックスとmvcの前にマップを登録します。 mvcのプレフィックスを登録し、Web APIのルートの前にマップします。あなたはmvcの属性ルーティングを使用して試してみてください。 – Nkosi

    +0

    私はそれを試してみましたが、うまくいきませんでした(質問で試したリストを参照してください) – Luis

    答えて

    1

    が最後にWebApiConfigで、次の制約にそれを作った。その後の逆を行う

    public static void RegisterRoutes(RouteCollection routes) 
    { 
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    
        routes.MapRoute(
         name: "Default", 
         url: "web/{controller}/{action}/{id}", 
         defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional } 
        ); 
    } 
    
    1

    MVCコントローラのWebプレフィックスが機能します。この場合、(APIのルーティングを設定する前に)MVCのルーティングを最初に設定します。

    (ちょうどこのWeb APIを開発し始めているので)あなたも知っているだけので、API

    config.Routes.MapHttpRoute(
        name: "DefaultApi", 
        routeTemplate: "{controller}/{action}/{id}", 
        defaults: 
         new { 
          controller = "Parking", 
          action = "Get", 
          id = RouteParameter.Optional 
          }, 
        constraints: new { controller = @"^web" }, 
    ); 
    
    +0

    私はそれを試してみました。 WebAPIとMVC。私はMVCのプレフィックスとして "web"を使用しましたが、ルートを解決するときにWebAPIルーティングルールを入力し、 "web"がコントローラになると予想しました。 – Luis

    +0

    は、Webを無視するという制約で答えを更新しました。 – vijayst

    0

    に次の制約を追加し、MVCコントローラとWeb APIコントローラが今MVC 6.0で統一/マージされます(ASP.NET Core 1.0)。だから、あなたが継承しているコントローラについてもっと混乱することはありません。それ以外にも、.NETコアフレームワークを使用すると、大きなパフォーマンス上の利点があります。

    +0

    クール、私はそれを考慮に入れます、多分それはその問題に関するいくつかの研究に値する! – Luis