APIルーティング404オプションパラメータが不足している場合
-
21-12-2019 - |
質問
私は私のWebApiConfig
でこのルーティングを設定しています public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
.
およびこれらのメソッド/ pipi/productController.cs
public object GetProduct(int id)
{
var productRepo = new ProductRepository(db);
var product = productRepo.GetItem(id);
return product.ToAnonymousType();
}
public object GetTest()
{
var productRepo = new ProductRepository(this.db);
var product = productRepo.GetItem(10000);
return product.ToAnonymousType();
}
.
私は/ API / Product / GetProduct / 10000を要求することができ、JSONを戻すことができます。
リクエスト/ API / Product / Gettest i 404
GetTestを
に変更した場合public object GetTest(int id)
.
とrequest / api / product / gettest / 10000 JSONを入手します。
私はその404が起こっている理由はわかりません。通常として要求を処理している他のコントローラ(非API要求の場合)があります。私はいくつかのウェブフォームの後にMVCに新たに登場しています、そしてこれは私が逆になっています。参考のために、ここで私のrouteconfig
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
.
と私のapplication_start
protected void Application_Start()
{
BundleConfig.RegisterBundles(BundleTable.Bundles);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
. 解決
これはあなたのルートの順序付けによるものです。
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
は
の前に呼び出されますGlobalConfiguration.Configure(WebApiConfig.Register);
.
とあなたの登録ロウトメソッドには、デフォルト(および非常に一般的な)ルート
が含まれていますurl: "{controller}/{action}/{id}"
.
この一般的な(デフォルト)ルールは
のURLパターンと一致しますapi/product/gettest
.
WebAPIルートの前にそれに一致する機会が得られます。
必要でなければ、そのスーパー総称ルートを取り除くことができます(そしてより具体的なルートを使用する)、または単に呼び出しを
に移動することができます。GlobalConfiguration.Configure(WebApiConfig.Register);
.
への呼び出しの前に来る
RouteConfig.RegisterRoutes(RouteTable.Routes);
.
あなたのGlobal.Asax。
私はあなたが与えたすべての情報を使ってサンプルを構築し、その呼び出しをうまく機能してきました。 私はこれが助けを願っています。
所属していません StackOverflow