0

以前は、2 つの方法があり、1 つに と[WebGet]のラベルを付けました。[WebInvoke(Method = "POST"]

指定した URL に対して GET または POST を実行すると、常に正しいメソッドが呼び出されます。

URL は次のとおりです。

POST: fish-length
GET: fish-length?start-date={startDate}&pondId={pondId}

Web API を使用するようになったので、次のようにルートを個別に定義する必要があります。

    RouteTable.Routes.MapHttpRoute(
        name: "AddFishLength",
        routeTemplate: "fish-length",
        defaults: new
        {
            controller = "FishApi",
            action = "AddFishLength"
        });


    RouteTable.Routes.MapHttpRoute(
       name: "GetFishLength",
       routeTemplate: "fish-length?start-date={startDate}&pondId={pondId}",
       defaults: new
       {
           controller = "FishApi",
           action = "GetFishLength"
       });

?ただし、routeTemplate で許可されていないため、2 番目のルートは機能しません。

URL 形式を次のように変更することはできますがfish-length/{startDate}/{pondId}、サービスを公開するにはあまり良い方法ではありません。

これを行うより良い方法はありますか?また、以前は同じ URL に対して POST と GET を行っていたため、ルーティング メソッドでこれが引き続き許可されていることを確認する必要があります。上記が機能したと仮定すると、どのように正しくルーティングされるかはまだわかりません。

4

2 に答える 2

0

いいえ、別のルートを定義する必要はありません。必要なのは単一のルートだけです:

RouteTable.Routes.MapHttpRoute(
    name: "AddFishLength",
    routeTemplate: "fish-length",
    defaults: new
    {
        controller = "FishApi",
    }
);

次に、ApiController のアクションの RESTful 命名規則に従います。

public class FishApiController: ApiController
{
    // will be called for GET /fish-length
    public HttpResponseMessage Get()
    {
        // of course this action could take a view model
        // and of course that this view model properties
        // will automatically be bound from the query string parameters
    }

    // will be called for POST /fish-length
    public HttpResponseMessage Post()
    {
        // of course this action could take a view model
        // and of course that this view model properties
        // will automatically be bound from the POST body payload
    }
}

したがって、ビューモデルがあると仮定します:

public class FishViewModel
{
    public int PondId { get; set; }
    public DateTime StartDate { get; set; }
}

コントローラーのアクションを変更して、このパラメーターを取得します。

public class FishApiController: ApiController
{
    // will be called for GET /fish-length
    public HttpResponseMessage Get(FishViewModel model)
    {
    }

    // will be called for POST /fish-length
    public HttpResponseMessage Post(FishViewModel model)
    {
    }
}

明らかに、さまざまなアクションに対してさまざまなビュー モデルを使用できます。

于 2013-01-02T11:54:37.807 に答える
0

ルート テンプレートでクエリ文字列パラメーターを指定することはできませんが、パラメーターの名前に一致するメソッドがある限り、WebApi はそれを独自に理解するのに十分なほど賢いはずです。

public HttpResponseMessage Get(string id)の要求に対応します。{controller}?id=xxx

ただし、実際のオブジェクトを見ないと、ケースを解決する方法を判断するのは困難です。たとえば、WebApi は Get リクエストで複雑な型を好まないだけでなく、特定の方法でのみ投稿データで URL エンコードされたコンテンツをサポートします。

Get と Post の区別は非常に簡単です。WebApi は、リクエストの送信時に使用したメソッドを認識し、Get/Post で始まるメソッド名、または HttpGet/Post 属性で装飾されたメソッド名を探します。

次の記事を参照することをお勧めします。これらの記事は、それがどのように機能するかを理解するのに役立ちました。

http://www.west-wind.com/weblog/posts/2012/Aug/16/Mapping-UrlEncoded-POST-Values-in-ASPNET-Web-API

http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

于 2013-01-10T20:49:25.303 に答える