5

初めての ASP.NET Web API を作成しています。標準の REST URL に従おうとしています。私の API は検索結果レコードを返します。私の URL は –

../api/categories/{categoryId}/subcategories/{subCategoryId}/records?SearchCriteria

IIS を介した検索と基本/ダイジェスト認証に oData を使用する予定です。私の問題は、ネストされたリソースにあります。検索結果を返す前に、ユーザーがこのカテゴリとサブカテゴリにアクセスできるかどうかを確認する必要があります。ここで、Visual Studio 2012 – MVC4 / Web API プロジェクトを作成して開始します。App_Start フォルダーには、URL とリソースの順序に関連すると思われる 2 つのファイルがあります。

1.RouteConfig.cs

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

2.WebApiConfig.cs

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

このモデルでは、私の URL が ../api/records?SearchCriteria の場合でも問題なく動作しますが、上記の私の URL 設計ではありません。もう少し読む必要があることは理解していますが、これまでのところ正しい記事を見つけることができません. 私の URL を取得する方法と、これら 2 つのファイルに必要な変更についてアドバイスが必要です。または、ここで見逃している他の構成はありますか? 前もって感謝します。

4

2 に答える 2

3

Asp.net Web API 2 は、すぐに使える属性ルーティングを提供します。Route個々のアクション メソッドまたはグローバル レベルで定義できます。

例えば:

[Route("customers/{customerId}/orders/{orderId}")]
public Order GetOrderByCustomer(int customerId, int orderId) { ... }

[RoutePrefix]属性を使用して、コントローラー全体に共通のプレフィックスを設定することもできます。

[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    // GET api/books
    [Route("")]
    public IEnumerable<Book> Get() { ... }

    // GET api/books/5
    [Route("{id:int}")]
    public Book Get(int id) { ... }
}

Web API 2 での属性ルーティングの詳細については、このリンクにアクセスしてください。

于 2013-11-26T04:37:59.623 に答える
2

categoryという名前のコントローラーがあると仮定すると、 WebApiConfig.csは、目的の URL に一致するように次のようなルートを持つことができます (個人的には/records部分をオフのままにします)。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{categoryId}/subcategories/{subCategoryId}",
    defaults: new { controller = "categories", categoryId = somedefaultcategory, 
        subCategoryId = RouteParameter.Optional }
);

メソッドは次のようになります。

// search a single subcategory
public IQueryable<SearchRecord> Get(int categoryId, int subCategoryId = 0, string SearchCriteria = "")
{        
    // test subCategoryId for non-default value to return records for a single 
    // subcategory; otherwise, return records for all subcategories
    if (subCategoryId != default(int))
    {
    }
}

しかし、サブカテゴリではなくカテゴリだけを返したい場合はどうすればよいでしょうか? より一般的な最初のルートの後に追加のルートが必要になります。

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

次のような 2 つの方法を使用します。

// search a single category
public IQueryable<SearchRecord> Get(int categoryId, string SearchCriteria = "")
{
}
// search all categories
public IQueryable<SearchRecord> Get(string SearchCriteria = "")
{
}
于 2013-06-04T15:12:07.327 に答える