2

私はhttp://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-apiをフォローしており、次のコントローラーを作成した後、私は予想外の結果を得る...

public class ProductsController : ApiController
{
    Product[] products = new Product[] 
    { 
        new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
        new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
        new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
    };

    public IEnumerable<Product> GetAllProducts()
    {
        return products;
    }

    public Product GetProductById(int id)
    {
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return product;
    }
}

次のような呼び出しができることを期待しています。

/api/products/GetAllProducts

しかし、これはうまくいきません。代わりに、次のように呼び出すことができます。

/api/製品

で説明されている手順を実際に実行しGetAllProducts()ます。これが期待どおりに機能しないのはなぜですか?

4

2 に答える 2

1

Url:を使用/api/products/GetAllProductsすると、Web API はデフォルト ルーティングのみをサポートするため、機能しません。

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

期待どおりに機能させるには、サポートするルートをもう 1 つ追加する必要がありますaction

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

2 番目のURL:については、次の/api/products理由で機能します。

idデフォルト ルートはオプションです()RouteParameter.Optional

そしてリンクから:

フレームワークは、次のように決定されたリクエストの HTTP メソッド (GET、POST、PUT、DELETE) に一致するアクションのみを選択します。

  • 属性を持つ HTTP メソッド: AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost、または HttpPut。

  • それ以外の場合、コントローラー メソッドの名前が "Get"、"Post"、"Put"、"Delete"、"Head"、"Options"、または "Patch" で始まる場合、慣例により、アクションはその HTTP メソッドをサポートします。

  • 上記のいずれでもない場合、メソッドは POST をサポートします。

あなたの場合、ブラウザからリクエストを行う場合、それはGETリクエストであるはずなので、このリクエストはGet(メソッドGetAllProducts)で始まるアクションにマップされます

于 2013-08-29T17:13:17.313 に答える