1

私のRouteConfig中には:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute("ApiController", "api/{controller}");

  routes.MapRoute("ApiControllerAndIntegerId", "api/{controller}/{id}", null, new { id = @"^\d+$" });

  routes.MapRoute("ApiControllerActions", "api/{controller}/{action}");
}

次に、がありLookupControllerます。

public class LookupsController : ApiController
{
  public string Get()
  {
    return "Default Get";
  }
  // /api/lookups/custom
  [ActionName("custom")]
  public string CustomLookup()
  {
    return "Hello, World";
  }
}

に移動しても、の代わりに/api/lookups/custom取得します。私は何が間違っているのですか?Default GetHello, World

編集

MapHttpRouteとのさまざまなバリエーションを試しましたMapRoute。どちらも機能していないようです。

4

2 に答える 2

2

MVCルートは、定義した順序でチェックされます。/api/lookups/customヒットするはずの、に問題があります"api/{controller}/{action}"。ただし、その前にとが"api/{controller}/{id}"ある"api/{controller}"ので、そのうちの1つがそれをキャッチしているように見えます。{id}私の推測では、これら2つの最初のように「カスタム」を解析しようとしていると思います。ルートでデフォルトのコントローラーまたはアクションを指定していないことに気付きました。投稿する前にそれらを取り出してスペースを節約することも可能ですが、デフォルトを指定していない場合は、そうすることをお勧めします。独自のデフォルトを選択できるかどうかに関係なくプログラムの「私は何をすべきかわからない」という行動です。

これらの3つのルートを指定する順序を逆にします。疑わしい場合は、最長で最も具体的なルートを一番上に置き、徐々に曖昧になります。より一般的なルートを上に配置すると、それらのルートは、さらに下のより具体的なルート定義に移動する必要があるものをキャッチする傾向があります。

于 2013-03-26T15:56:49.123 に答える
1

Web Apiに間違った構成ルートを使用しています。次MapHttpRouteの代わりに使用する必要がありますMapRoute

var configuration = GlobalConfiguration.Configuration;

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

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

注意してください:ルート"api/{controller}/{action}/{id}"を上に置く"api/{controller}/{id}"

また、このアクションのGETメソッドをサポートするようにマーク[HttpGet]を付けます。CustomLookup

// /api/lookups/get
public string Get()
{
    return "Default Get";
}

// /api/lookups/custom
[ActionName("custom")]
[HttpGet]
public string CustomLookup()
{
    return "Hello, World";
}

それが動作します

于 2013-03-26T15:42:55.093 に答える