質問

私は私の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。

私はあなたが与えたすべての情報を使ってサンプルを構築し、その呼び出しをうまく機能してきました。 私はこれが助けを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top