2

これは、MVC Web API を使用した最初のロデオであり、ルーティングの側面を理解する上でいくつかの問題があります。次のような uri テンプレートが必要です。

  1. http://google.com/api/AzureQueue - キュー内のすべてのアイテムの GET
  2. http://google.com/api/AzureQueue/DeviceChart/ - GET はエージェントのデバイスと処理時間を返します

http://google.com/api/ {controller}/{id} <-- デフォルト http://google.com/api/ {controller}/{chartType}/{id} ここで、ID はオプションです

私が苦労しているところは次のとおりです。非アクションとアクション、アクション名などを指定

どんな助けでも大歓迎です

4

1 に答える 1

1

あなたはほとんどそこにいます。デフォルト ルート (WebApiConfig.cs次のようになります。

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

非常に重要な注意事項が 1 つあります。ルートは宣言された順序で検査され、最初に一致したルートが使用されるため、デフォルト ルートは最後に移動する必要があります。

さまざまなチャート タイプの呼び出しを 1 つのアクションに送るか、それとも複数のアクションに送るかを決定する必要があります。

1 つのアクションの場合:

WebApiConfig.cs

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

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

AzureQueueController.cs

public class AzureQueueController : ApiController
{
    public string Get(string chartType)
    {
        return "chart = " + chartType;
    }
    public string Get(string chartType, int id)
    {
        return "chart = " + chartType + ",id = " + id.ToString(); 
    }
}

ここで注目すべき点が 2 つあります。デフォルトに割り当てられた匿名クラスでは、コントローラーの値によって、要求をルーティングするコントローラーが決定されます。これは、ルート テンプレートに含めることも、単にクラスで定義することもできます。また、タイプ Get のリクエストは、テンプレートに一致する Url 内の引数で始まり、Getその引数を持つアクションに自動的に送信されます ( はオプションであるため、2 つの異なるケースidがあります)。

さまざまなチャートのビジネス ロジックが異なる場合を除き、これは私の好みの方法です。

一方、これを指定できます:

WebApiConfig.cs

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

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

ここでは isという単語actionをテンプレートとして使用しているため、これはアクション名として解釈されます。

AzureQueueController.cs

    [HttpGet]
    public string DeviceChart()
    {
        return "chart = DeviceChart" ;
    }

    [HttpGet]
    public string DeviceChart(int id)
    {
        return "chart = DeviceChart" + ",id = " + id.ToString(); 
    }

ここでは文字列引数はありません。URL のその部分は、使用するアクション (パブリック メソッド) を決定するために使用されています。また、アクション名が で始まらないため、メソッドごとGetに属性を追加して、GET リクエストを受信できることを示す必要があります。[HttpGet]

あなたのプロジェクトで頑張ってください。

于 2013-02-09T04:40:17.550 に答える