ASP.NET CoreのMVC6が2つのパターンを1つにマージしたという事実が気に入っています。これは、両方の世界をサポートする必要があることが多いためです。Controller
標準のMVCを微調整して(および/または独自のActionResult
クラスを開発して)、のように動作および動作させることができるのは事実ですがApiController
、保守とテストが非常に難しい場合があります。さらに、ControllersActionResult
メソッドを他のメソッドと混合して返すようにすることもできます。生/シリアル化/IHttpActionResult
データを返すことは、開発者の観点からは非常に混乱する可能性があります。特に、単独で作業しておらず、他の開発者にそのハイブリッドアプローチを高速化する必要がある場合はそうです。
ASP.NET非コアWebアプリケーションでこの問題を最小限に抑えるためにこれまでに得た最善の手法は、Web APIパッケージをMVCベースのWebアプリケーションにインポート(および適切に構成)することです。これにより、両方の長所を活用できます。 worlds:Controllers
ビューApiControllers
用、データ用。
これを行うには、次のことを行う必要があります。
- NuGetを使用して次のWebAPIパッケージをインストールします。
Microsoft.AspNet.WebApi.Core
およびMicrosoft.AspNet.WebApi.WebHost
。
- 1つ以上のApiControllerを
/Controllers/
フォルダーに追加します。
- 次のWebApiConfig.csファイルを
/App_Config/
フォルダーに追加します。
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
最後に、上記のクラスをスタートアップクラスに登録する必要があります(OWINスタートアップテンプレートを使用しているかどうかに応じて、またはのいずれか)Startup.cs
。Global.asax.cs
Startup.cs
public void Configuration(IAppBuilder app)
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureAuth(app);
// ...
}
Global.asax.cs
protected void Application_Start()
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// ...
}
このアプローチは、その長所と短所とともに、私がブログに書いたこの投稿でさらに説明されています。