7

WebAPI プロジェクトに News というコントローラーがあり、次の URL を処理する Get という 2 つの既定のアクションがあります。

/api/News <- これはニュースのリストを返します /api/News/123 <- これは ID によって特定のニュース項目を返します。

これまでのところすべて簡単で、明らかにデフォルト ルートがこれらのシナリオを処理します。次に、次のような URL が必要です。

/api/News/123/Artists <- 指定されたニュース項目に関連するすべてのアーティストを返します。

今、私は ASP.Net MVC と WebAPI についてかなりニュースになっているので、ルーティングに対処しなければならなかったのはこれが初めてです。デフォルトルートを次のように変更しました。

routes.MapRoute(
            name: "Default",
            url: "{controller}/{id}/{action}",
            defaults: new { controller = "News", action = "Get", id = UrlParameter.Optional }

そのため、ここでは {action} を URL の末尾に移動し、Artists メソッドを News コントローラーに追加しました。これは最初の 2 つのシナリオでは機能しますが、3 番目のシナリオでは 404 を返します。

/api/News/123/Artists のルーティングが機能していないことは明らかですが、その理由はわかりません。

このようにWebAPIを使用している人々の例を見つけることができないようで、根本的に間違ったことをしていると思います。

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

4

3 に答える 3

8

問題は、Web APIにアクセスしようとしているが、 ASP.NET MVCをマッピングしようとしていることです。

これは必要なマッピングです:

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

そして、それはApp_Start \ WebApiConfig(デフォルトのテンプレート設定を使用している場合)で行う必要があります

メソッドの例 (ニュース API コントローラー内):

// GET api/values/5
public string Get(int id)
{
  return "value " + id;
}

// GET api/values/5
[HttpGet]
public string Artist(int id)
{
  return "artist " + id;
}
于 2013-02-12T16:31:18.407 に答える
3

AttributeRoutingは良い解決策になるはずです。でインストールできNuget、ドキュメントはこちらです。

いくつかの例

public class SampleController : Controller
{
    [GET("Sample")]
    public ActionResult Index() { /* ... */ }
                    
    [POST("Sample")]
    public ActionResult Create() { /* ... */ }
                    
    [PUT("Sample/{id}")]
    public ActionResult Update(int id) { /* ... */ }
                    
    [DELETE("Sample/{id}")]
    public string Destroy(int id) { /* ... */ }
    
    [Route("Sample/Any-Method-Will-Do")]
    public string Wildman() { /* ... */ }

    [GET("", ActionPrecedence = 1)]
    [GET("Posts")]
    [GET("Posts/Index")]
    public ActionResult Index() { /* ... */ }

    [GET("Demographics/{state=MT}/{city=Missoula}")]
    public ActionResult Index(string state, string city) { /* ... */ }
}

については非常にうまく機能しcustom routingます。

アップデート

asp.net WebApi 2では、AttributeRoutingはネイティブによって内部に含まれています。それにはいくつかの歴史があり、最初のバージョンはasp.net WebApi 1、注釈のルーティングに弱いです。

そして、asp.net WebApi 2リリースされ、AttributeRoutingネイティブに含まれています。そのため、そのオープンプロジェクトはもう維持されていません、とGitHubページで述べています。

マイクロソフトのブログでは、セクションIndependent Developer Profile – Tim McCall – Attribute Routing in MVC and Web API 2は歴史についても述べました。

于 2013-02-20T10:19:06.037 に答える
1

In routing Action は、ルーティング先のメソッドのアクション名です。そのアクション名は、メソッドで使用される属性に含まれている必要があります。

 [HttpGet]
 [ActionName("CustomAction")]
public HttpResponseMessage MyNewsFeed(Some params)
{ return Request.CreateResponse(); }

ルートは次のようになります

routes.MapRoute(
        name: "Default",
        url: "{controller}/{id}/{action}",
        defaults: new { controller = "News", action = "CustomAction", id = UrlParameter.Optional 

これが役立つかどうか教えてください。

于 2013-02-12T16:22:27.307 に答える