0

MVC4 Web API プロジェクトには、以下の「itemtypelist」ルートがあります

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

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

  routes.MapRoute(
  name: "itemtypelist",
  url: "{controller}/list/{itemtype}/{searchtext}",
  defaults: new { controller = "home", action = "list", itemtype = (string)null, searchtext = (string)null }
  );

}

これは、次のコントローラーアクションにマップすることを目的としています

[AcceptVerbs("GET", "POST")]
public IEnumerable<Repository.ViewModel.Brand> List(string itemType, string searchText)

とURL

/api/brand/list/mytype/mysearchtext

ただし、URL は 404 メッセージを返します。このルートとコントローラー アクションは Web サイト プロジェクトでは機能しますが、Web API プロジェクトでは機能しません。アクションが見つからない原因となる MVC4 Web API プロジェクトの違いは何ですか?

4

1 に答える 1

7

アクションが見つからない原因となるMVC4WebAPIプロジェクトの違いは何ですか?

すべてが異なります。絶対にすべて。APIルートを構成する方法から始めて、モデルバインディング全体を経て、ベースコントローラーまで。したがって、基本的に、Web APIを開発する場合は、ASP.NETMVCについて知っていることをすべて忘れてしまいます。マイクロソフトはすべてのものを複製しました。これは、新しいデザイン、新しいアセンブリ、新しい名前空間、新しいAPIです。ASP.NETMVCとは何の関係もありません。

したがって、Web APIルートを構成する場合は、標準のMVCコントローラー専用のMapHttpRoute拡張メソッドではなく拡張メソッドを使用する必要があります。ベース(MVCアプリケーションでの使用に慣れている)と(APIコントローラーのベースクラスである)をMapRoute混同しないでください。それらは2つの完全に異なる獣です。System.Web.Mvc.ControllerSystem.Web.Http.ApiController

したがって、ApiControllerのルートを構成する方法は次のとおりです。

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "DefaultAPI",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

また、RESTful APIでは、ルートでアクション名を指定しないことに注意してください。これは、それを消費するために使用されるHTTP動詞から推測されます。good articleこれは、WebAPIでのRESTfulルーティングについて読むことをお勧めします。

ちなみに、インターネットまたは空のテンプレートを使用して新しいASP.NET MVC 4プロジェクトを作成すると、VisualStudioによって2つのファイルが作成されることに気付くでしょう。

  1. ~/App_Start/RouteConfig.cs-すべての標準MVCルートを配置する場所
  2. ~/App_Start/WebApiConfig.cs-すべてのWebAPI構成(ルート、カスタムフォーマッターなどを含む)を配置する場所

また、2つのまったく異なるアプローチを使用していることにも気付くでしょう。Web APIは、たとえばコンソールアプリケーションで自己ホストできることを忘れないでください。そのため、Microsoftはすべてをゼロから実装することにしました。彼らはASP.NETMVCとの結合を望んでいませんでした。

于 2013-01-07T22:06:58.227 に答える