2016-07-07 17 views
1

属性ベースのルーティングであるWebAPI 2.2を使用しています。なぜクエリ文字列が機能しないのか、またはそれらを有効にする方法がわかりません。私はこれに関する他のSOの質問を読んだが、彼らは私にあまり適用されなかった。WebAPI 2.2、属性ベースのルーティングとクエリ文字列

ここでは本当に簡単APIControllerです:私はhttp://localhost/api/HelloMessage/1でそれをヒットした場合、それは、

[Route("api/HelloMessage")] 
public async Task<IHttpActionResult> Get() 
{ 
    var result = await Task.FromResult(new string[] { "Hello", "World" }).ConfigureAwait(false); 
    return Ok(result); 
} 

[Route("api/HelloMessage/{id}")] 
public async Task<IHttpActionResult> Get(int id) 
{ 
    var result = await Task.FromResult($"Hello {id}").ConfigureAwait(false); 
    return Ok(result); 
} 

(また、WebApiConfig.csに行き、そしてMapHttpRouteで作成されたデフォルトルートをコメントアウト)

よく働く。

しかし、http://localhost/api/HelloMessage?id=1でヒットした場合、それはパラメータなしバージョンにバインドされます。どこが間違っていますか?

一つ奇妙なこと:

I再度有効MapHttpRouteコードであれば、その後、ルーティング作品(そのパラメータ化メソッドへのid = 1つのルート?)。

私はwoudlがなぜ属性ベースのルーティングで動作しないのか知りたいのですが。これはバグですか、それとも間違っているのですか?

ここでそれを動作させるだろうMapHttpRouteコードです:

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

答えて

1

仕様です。慣例に基づいたデフォルトのルーティングでは、のように{id}がオプションなので、api/{controller}/{id}のようなルートをパラメータなしのアクションにマップします。

属性ルーティングを使用すると、ルーティングプロセスの制御と柔軟性が向上します。

あなたはこの

[Route("api/HelloMessage/{id?}")] 
public async Task<IHttpActionResult> Get(int id) {...} 

ようidをオプションにすることができますしかし、それは今、彼らの両方が一致api/HelloMessageとして最初のルートとの競合を引き起こすルーティング属性でたとえば。

URIからURLを取得してhttp://localhost/api/HelloMessage?id=1を動作させたい場合は、まずパラメータを持たないアクションを削除するか、ルートを変更して別のアクションのIDをオプションにする必要があります。

フレームワークでは、URIの?id=1がパラメータに一致し、その値をパラメータに渡します。

+0

ありがとうございます。私は、HttpMapRoute()で得られる動作が、属性ベースのルーティングで得られる動作と大きく異なることは、本当に奇妙なことです。私は彼らがなぜ彼らの機能を変えたのだろうと思います。 – JMarsch

+0

私はどこかで、MVCとWeb APIのフレームワークに取り組んでいるチームが違っていると読んでいます。彼らは同様の機能を共有しているかもしれませんが、フードの下ではそれは異なって開発されました。最終的にvNextバージョンの共通バージョンにマージされ、最終的にaspドットネットコアとなりました。 – Nkosi

関連する問題