8

Web API を使用する MVC 5 では、属性ルートのみを使用して次のようにしています。

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.([iI][cC][oO]|[gG][iI][fF])(/.*)?" }); // TODO: Check for Apple Icons

RouteTable.Routes.MapMvcAttributeRoutes();
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
AreaRegistration.RegisterAllAreas();

RouteTable では、すべての MVC ルートが作成されました...しかし、API ルートではありません...

RouteTable.Routes を確認したところ、例外が表示されました。

オブジェクトはまだ初期化されていません。HttpConfiguration.EnsureInitialized() がアプリケーションのスタートアップ コードで他のすべての初期化コードの後に​​呼び出されることを確認します。

System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() で System.Web.Http.Routing.RouteCollectionRoute.GetEnumerator() で System.Linq.SystemCore_EnumerableDebugView`1.get_Items() で

これをテストするために、プロジェクトに Web Api アクションを 2 つだけ追加しました。

[RoutePrefix("api")]
public class StatApiController : ApiController {

  [Route("stats/notescreateddaily"), HttpGet]
  public IHttpActionResult NotesCreatedDaily() {
    // Some code
  }

  [Route("stats/userscreateddaily"), HttpGet]
  public IHttpActionResult UsersCreatedDaily() {
    // Some code
  }

}

何か不足していますか?

ありがとう、ミゲル

4

3 に答える 3

19

ソリューションは実際には次のものを置き換えています:

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

に:

GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());

これは Web API 2 での変更です。

于 2013-11-09T20:12:39.690 に答える
1

解決策は、すべての Web API 関連の構成が完了した後に呼び出すGlobalConfiguration.Configuration.EnsureInitialized();ことですが、登録がこのようになっている理由について知りたいです... MVC5 プロジェクトを作成するためにどのような種類のプロジェクト テンプレートを使用しましたか?... 定義済みのテンプレートVisual Studio に付属しているのは、ルートの順序付けの問題を最小限に抑えるのに役立つ構造を持っているため、それらを使用することをお勧めします。なぜ構成構造がそのように見えるのか疑問に思っています...

于 2013-11-09T20:04:30.443 に答える
1

ASP.Net Web API 4.0 から 4.5 を使用してすべての Web サービス プロジェクトをアップグレードし、Cors ライブラリで Web API 2.2 を使用した後、同じ問題が発生しました。私は問題をうまく解決することができました。私がしたことは、App_Start フォルダーの RouteConfig.cs ファイルにある次のステートメントを削除またはコメントアウトすることでした:`

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace myNameSpace.Configurations
{
    public static class RouteConfig
    {

        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            //DON'T USE THIS. IT WILL GIVE PROBLEMS IN INSTANTIATION OF OBJECTS
            //config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "LocationData",
                routeTemplate: "dataservices/locations/{controller}/{action}/{id}",
                defaults: new {action = "Index", id = RouteParameter.Optional }
            );


            config.Routes.MapHttpRoute(
                name: "ProfileData",
                routeTemplate: "dataservices/profiles/{controller}/{action}/{id}",
                defaults: new { action = "Index", id = RouteParameter.Optional }
            );



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

    }
}

Global.asax.cs ファイルで、古いルーティング登録を使用しています

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Net.Http.Formatting;

using myNameSpace.IoC;
using myNameSpace.Configurations; // Here actually I change the protected void Application_Start() to protected void Configuration() and change the folder to configuration instead on App_Start
using myNameSpace.Controllers.ExceptionSchema;
using myNameSpace.Filters.HttpFilters;

namespace myNameSpace
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        public static void RegisterApis(HttpConfiguration config)
        {
            config.Filters.Add(new CustomHttpExceptionFilter());
        }
        protected void Application_Start()
        {
            //AreaRegistration.RegisterAllAreas();
            RegisterApis(GlobalConfiguration.Configuration);


            var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);


            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.Register(GlobalConfiguration.Configuration);
        }
    }
}

理由は次のとおりです: Web API 2 の属性ルーティング

注: Web API 1 からの移行

Web API 2 より前は、Web API プロジェクト テンプレートは次のようなコードを生成していました。

protected void Application_Start()
{
    // WARNING - Not compatible with attribute routing.
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

属性ルーティングが有効になっている場合、このコードは例外をスローします。属性ルーティングを使用するように既存の Web API プロジェクトをアップグレードする場合は、この構成コードを次のように更新してください。

protected void Application_Start()
{
    // Pass a delegate to the Configure method.
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

私は古いルートを使用しており、属性ルーティングを使用しないことにしました。そのため、OUT THAT ステートメントを取り出します

于 2014-09-09T10:53:54.697 に答える