2016-06-24 6 views
0

ASP.NetサイトのASP.Net Web API getting started tutorialを実行しています。これらの名前/マッピングはどこから来ていますか?

私は例をコード化しました。私はすべてのことを理解しています。私はC#で非常に経験がありますが、以前はASP.Netに触れていませんでした。

この例では、ProductクラスとProductsController : ApiControllerクラスを作成します。それは大丈夫です。

/api/productsに移動すると、定義されている製品の一覧が表示され、/api/products/idに移動すると、そのIDの製品が一覧表示されます。

どこから来たのですか?このクラスはProductと呼ばれ、1つはProductsControllerと呼ばれていますので、「製品」がどこから来ているのか分かりません。また、GetAllProducts()GetProduct(int)の名前をランダムに変更しようとしましたが、はまだ動作します。

ここでは何が起こっていますか?誰かがDesktop C#の開発から来ているので、私はこれらの間の接続がどこにあるのかわかりません。何かを行う/api/foo/barのような私自身のAPIをどうやって作ることができません。

+0

をウェブAPIはWeb要求を受信すると、それはconvensionによってあなたのコントローラの方法のいずれかへのルート:http://www.asp.net/web-api/概要/ web-api-routing-and-actions/routing-in-aspnet-web-api – Vince

答えて

1

WebAPIは、リクエストをルーティングする正しいコントローラを決定するために、定義済みの命名規則のセットをサポートしています。

まず、デフォルトルートの設定を行ってください。

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

WebAPIのは試してみて、実行するアクションを決定するには、次の手順を実行します:、コントローラを見つけるためにWeb APIを

  • をするControllerを追加{controller}変数の値(productsProductsControllerに変更)。
  • アクションを見つけるために、Web APIはHTTPメソッドを調べ、そのHTTPメソッド名で始まる名前のアクションを探します。たとえば、GET要求では、Web APIは、GetProductまたはGetAllProductsなど、Get...で始まるアクションを探します。この規則は、GET、POST、PUT、およびDELETEメソッドにのみ適用されます。
  • {id}のようなルートテンプレートの他のプレースホルダ変数は、アクションパラメータにマップされます。

あなたがここでより多くの情報を見つけることができます。Routing in ASP.NET Web API

+0

わかりました。 'ProductsController'の名前を' DuctsprodController'に変更しました。これで '/ api/ductsprod'でアクセスできます。これは通常のデスクトップC#プログラミングと比べると非常に奇妙です。関数/クラスの部分文字列が使われる場所や、システムが "[...]で始まる名前のアクションを探す場所"は決して見たことがありません。また、 'ProductsController'は静的ではなく、どこからでもインスタンス化されているのを見ることができません。オブジェクトはどこから来ますか?私はブラウザが '/ api/products'にナビゲートするときにCLRがちょうど1つを作成すると思いますか? – Ozzah

+0

HTTPはステートレスなので、コントローラの新しいインスタンスは、すべての要求に対してWebAPIフレームワークによってインスタンス化されます。 –

1

名前付け変換によってルートが作成されるためです。 ProductsControllerクラスは/productsの部分を返し、GetAllProductsはHTTPメソッドGETを返します。したがって、/api/productsというリクエストが対応するメソッドにヒットします。 GetAllProductsの名前をGet123に変更しても、web-apiはGetキーワードのみを扱うため、パラメータはありません。

GetProduct(int id)は同じですが、唯一の違いはパラメータがあることです。それが/api/products/1でヒットしたのはそのためです。 web-apiはリクエストurlとのベストマッチ(反映)を選択します。同様に、名前をGet123(int id)に変更しても同様に機能します。

上記はデフォルトの名前付け変換ルートです。 RouteAttributeでいつでも変更できます。

関連する問題