2017-12-19 13 views
1

ベンダーアプリケーションによって事前定義されたREST APIを実装するプロジェクトを構築する必要があります(消費することになります)。何千ものRESTリソースがあり、動詞(POST、GET、PUT、DELETEなど)。 ASP.NETのWeb - 私はちょうどルートを登録しながら、MapHttpRouteを呼び出すApiControllerからこのようなクラスを継承することができます以前のバージョンではASP.Net Coreの非属性ルートWebApi

public class SomethingController 
{ 
    public Something Post(string name, DateTime time) 
    { 
    // ... 
    } 

    public int PostStrange(string text) 
    { 
    // ... 
    } 

    public Something Put([FromBody]Something item) 
    { 
    // ... 
    } 

    public void Delete(int id) 
    { 
    // ... 
    } 
} 

ので、理想的には、各リソースのために私はこのような単一のクラスを持っている必要がありますApiは私の必要に応じて行います...しかし、.NET CoreではMapHttpRoute/ApiControllerのようなものは見つけられません。ルーティングとhttp動詞の属性があり、各クラス/メソッドのすべてを明示的に定義する必要があります:

[Route("api/[controller]")] 
public class SomethingController : Controller 
{ 
    [HttpPost] 
    public Something Post(string name, DateTime time) 
    { 
     // ... 
    } 

    [HttpPost("api/[controller]/strange")] 
    public int PostStrange(string text) 
    { 
     // ... 
    } 

    [HttpPut] 
    public Something Put([FromBody]Something item) 
    { 
     // ... 
    } 

    [HttpDelete] 
    public void Delete(int id) 
    { 
     // ... 
    } 
} 

何千ものRESTリソースの属性は非常に退屈で、エラーが発生しやすいです...

ここに何かがありますか?なぜ、かなり新しくて現代的なASP.NET Coreでは、REST-Apiを構築することが非常に一般的で重要なことは、古いASP.NETと比べて複雑すぎるのですか?

答えて

2

ナゲットパッケージMicrosoft.AspNetCore.Mvc.WebApiCompatShimがあります。主な目的は、Web APIからコアへの移行を容易にすることです。また、必要なアクションにコンベンションベースのルーティングを実行する方法も提供します。だから、最初に起動して、そのパッケージをインストールします。

public void ConfigureServices(IServiceCollection services) { 
    // add conventions here 
    services.AddMvc().AddWebApiConventions();     
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { 
    app.UseMvc(routes => { 
     // map one global route 
     routes.MapWebApiRoute("WebApi", "api/{controller}"); 
    }); 
} 

をこの小さな設定した後、あなたのコントローラを継承するか、ウェブAPI、またはネイティブasp.netからの移行の便宜のために、上記パッケージに追加されApiController、からコアControllerApiControllerの例:

public class SomeController : ApiController { 
    // maps to GET /api/Some 
    // note - no routing attributes anywhere 
    public HttpResponseMessage Get() { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

    // maps to POST /api/Some 
    public HttpResponseMessage Post() { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

ネイティブのasp.netコアコントローラ:

[UseWebApiRoutes] 
[UseWebApiActionConventions]  
public class BaseController : Controller { 

} 

public class TestController : BaseController { 
    // maps to GET /api/Test 
    // no attributes 
    public IActionResult Get(string p) { 
     return new ObjectResult(new { Test = p }); 
    } 
} 

は、あなたがウェブから移行されていない場合:あなたはまた、これらの属性を使用してベースコントローラをマークすることができ

// mark with these attributes for it to work 
[UseWebApiRoutes] 
[UseWebApiActionConventions] 
public class TestController : Controller { 
    // maps to GET /api/Test 
    // no routing attributes, but two "conventions" attributes 
    public IActionResult Get(string p) { 
     return new ObjectResult(new { Test = p }); 
    } 
} 

api - ネイティブの Controllerを使用することをお勧めします。 ApiControllerは構造が異なります(asp.net web api ApiControllerと似ています)。そのため、意図した目的以外の目的で使用する理由はあまりありません(Web APIからの移行)。

1

MapRouteはまだhttps://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing

属性ルーティング賛辞MapRoute、それが置き換えられません。

明らかに、例を単純化するためにRoutingについての部分を削除する例がかなりあります。ちょうどディッパを掘りなさい。

+0

はい 'MapRoute'はまだそこにありますが、' MapHttpRoute'は言及されていません - それらは完全に異なるルートマッピングを提供します。 'MapRoute'はurlクエリー文字列からコントローラのアクションメソッドへのマッピングを提供するだけで、MapHttpRouteはHTTP動詞とクエリ文字列からapiコントローラのverb-methodsへのマッピングとして提供されました。 – rufanov

+0

'MapRoute'を使うと、リソース(REST-apiの本質である)を使って別のhttp動詞で呼び出すことができる' api/something'のような単一の名前付きRESTリソースをアーカイブすることはできません。 api/something/put'、 'api/something/put'、' api/something/put'、 'api/something/putstrange'の4つの異なるURLをMapRouteでマップします – rufanov

関連する問題