HttpConfiguration.EnsureInitialized ()를 확인하십시오


142

Visual Studio 2013을 설치했으며 앱을 실행할 때 아래 오류가 발생합니다.

이 객체를 어디에서 초기화해야하는지 전혀 모른다.

무엇을해야합니까?

    Server Error in '/' Application.

The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.]
   System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() +101
   System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +63
   System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext) +107
   System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) +233
   System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase context) +60
   System.Web.Routing.UrlRoutingModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +82
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18408

이것은 AlumCloud입니다

답변:


141

아래 @ gentiane의 답변을 참조하십시오이것을 처리하는 올바른 방법은 .

Application_Start방법 의 끝에 다음을 Global.Asax.cs추가하십시오.

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
이 답변을 얻었으므로 VS 2013의 미리보기 버전에서 생성 된 프로젝트를 업데이트 1로 생성 된 프로젝트와 비교했지만 차이점은 WebApiConfig.Register (...)를 GlobalConfiguration.Configure (로 대체했다는 것입니다. ..) gentiane이 답변에서 설명하는 것처럼. 이렇게하면 문제가 해결됩니다.
Bryan Bedard

1
이것이 바로 GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)configurationCallback 이후에 호출 되는 것입니다.
cmxl

4
GlobalConfiguration.Configure (WebApiConfig.Register) 전에 DI 구성을 수행 할 때 오류가 발생할 수도 있습니다. 전화
Silvos

감사합니다. 그것은 내 곁에 가시였다.
Robert Bolton

241

Application_Start의 끝에서이를 수행하면 WebApiConfig.Register가 호출되었으므로 너무 늦습니다.

이를 해결하는 가장 좋은 방법은 Global.asax에서 대체하여 새로운 초기화 방법을 사용하는 것입니다.

WebApiConfig.Register(GlobalConfiguration.Configuration);

으로

GlobalConfiguration.Configure(WebApiConfig.Register);

12
Microsoft 문서를 기반으로하는 것이 올바른 방법입니다. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo

API 경로가 작동하지 않을 때 mvc 앱을 마이그레이션하고 이것을 추가하고 MapHttpAttributeRoutes를 추가하여 모든 것을 실현했습니다.
Phil Cooper

1
이 대답은 나를 위해 고쳤습니다.
GiddyUpHorsey

그러나 WebApiConfig 비 정적 클래스가있는 경우 어떻게해야합니까?
Georgy Grigoryev

@GeorgyGrigoryev : 다음과 같이 액션 안에서 인스턴스화 할 수 있습니다.GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

WebApi 내에서 속성 라우팅을 사용할 때 실제로이 오류가 발생했습니다.

나는했다

[라우트 ( "webapi / siteTypes / {siteTypeId"]

대신에

[라우트 ( "webapi / siteTypes / {siteTypeId}"]

내 경로에 대한이 오류가 발생했습니다. 나는 닫는 중괄호를 놓쳤다. 다시 추가하면이 오류가 다시 발생하지 않습니다.


23
또한 경로 앞에 [Route ( "api")] 대신 슬래시 [Route ( "/ api /"])를 붙일 때이 문제가 발생했습니다.
cguedel

1
{id : int} 대신 {int : id}
Marat Batalandabad 2016 년

1
이것은 항상 나를 얻지 만 다른 오류를주었습니다. Visual Studio 2015 및 .Net 4.6으로 업그레이드 한 후이 오류가 발생합니다.
14:47에

7
내 오류는 [Route ( "api / {parameter}")] 대신 [Route ( "api / {parameter : string}")]입니다. 분명히 : string을 type으로 두는 것은 기본값이므로 잘못되었습니다.
Jamby

1
Jamby와 마찬가지로 내 오류는 [Route ( "api / ObjectOfInterest / {type} / {name}")] ... 필요하지만 [Route ( "api / ObjectOfInterest / {type : string} / {name : string} ")] // WRONG ...이 작동하지 않습니다. System.Type이 아닌 문자열 인 'Type'이라는 매개 변수가 필요하다는 것이 이상하다는 것을 알고 있지만 문자열 사양을 제거하면 정상적으로 작동합니다.
Aidanapword

31

이것은 오래되었지만이 오류를 검색 할 때 Google의 첫 번째 결과입니다. 약간의 파고 난 후에 나는 무슨 일이 있었는지 알아낼 수있었습니다.

tldr :
모든 GlobalConfiguration.Configure 가 수행하는 조치는 조치를 호출하고 VerifyInitialized ()를 호출하는 입니다. VerifyInitialized 는 한 번만 실행되므로 Config.MapAttributeRoutes ()는 VerifyInitialized () 전에 호출해야합니다 .

의미 : 기존 Mvc 프로젝트에서 오는 경우 다음을 수행하면됩니다.

  1. GlobalConfiguration.Configuration.EnsureInitialized ();를 추가하십시오 . Application_Start 메소드 의 맨 아래에 .

또는

  1. 전체 구성을 GlobalConfiguration.Configure 에 대한 단일 호출로 이동하십시오 .
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

더 깊이 파기

HttpConfiguration.Configuration 에는 다음과 같이 정의 된 "Initializer"속성이 있습니다.

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () 는이 동작을 실행하고 _initializedtrue로 설정 합니다.

public void EnsureInitialized()
{ 
    if (_initialized)
    {
        return;
    }
    _initialized = true;
    Initializer(this);            
}

HttpConfiguration.MapAttributeRoutesHttpConfiguration.Initializer 를 설정하는 내부 메소드 AttributeRoutingMapper.MapAttributeRoutes 를 호출 합니다 .

public static void MapAttributeRoutes(...)
{
    RouteCollectionRoute aggregateRoute = new RouteCollectionRoute();
    configuration.Routes.Add(AttributeRouteName, aggregateRoute);

    ...

    Action<HttpConfiguration> previousInitializer = configuration.Initializer;
    configuration.Initializer = config =>
    {
        previousInitializer(config);
        ...
    };
}

GlobalConfiguration.Configure 는 조치를 호출 한 직후에 VerifyInitialized 를 실행합니다.

public static void Configure(Action<HttpConfiguration> configurationCallback)
{
    if (configurationCallback == null)
    {
        throw new ArgumentNullException("configurationCallback");
    }

    configurationCallback.Invoke(Configuration);
    Configuration.EnsureInitialized();
}

벽에 부딪히면 asp.net의 소스는 http://aspnetwebstack.codeplex.com/SourceControl/latest 에서 확인할 수 있습니다.


GlobalConfiguration.Configure를 한 번만 호출하면 솔루션이 생명을 구했습니다. 올바른 구성 순서와 속성 기반 라우팅 및 DI 구성에 문제가있었습니다. 또한 MS ApiVersioning을 사용하는데, 첫 번째 경로가 버전 관리 속성에 도달하기 전에 DI 주입이 필요했습니다. Thx 많이
Silvos

12

관련 문제가 있습니다. 때때로 GlobalConfiguration.Configure여러 번 호출 하면이 오류가 발생합니다. 이 문제를 해결하기 위해 모든 구성 초기화 논리를 한 곳에 두었습니다.


네, 이것은 분명히 제 사건이었습니다
Obi

감사합니다! 이것은 정확히 내 문제였습니다.
Søren Boisen

같은 문제가 있습니다! 두 시간 동안 문제를 해결하려고 했으므로 주석의 x입니다.
Sc0tTy

7

나에게 문제는 내 경로의 쿼리 문자열 필드에 명명 된 매개 변수를 사용하려고한다는 것입니다.

[Route("my-route?field={field}")]
public void MyRoute([FromUri] string field)
{
}

쿼리 문자열 필드는 매개 변수에 자동으로 매핑되며 실제로 경로 정의의 일부가 아닙니다. 이것은 작동합니다 :

[Route("my-route")]
public void MyRoute([FromUri] string field)
{
}

7

위의 답변이 설정되지 않은 경우 작동하지만 내 경우에는이 물건이 이미 설정되어 있습니다. 다른 점은 내가 작성한 API 중 하나에 경로 앞에 /을 붙였다는 것입니다. 예

[Route("/api/abc/{client}")] 

이 변경

[Route("api/abc/{client}")]

나를 위해 고쳤다


@Svend Indeed. 어리석은 것 같았지만, 몇 가지 경우에 문제가있는 것 같습니다. : P
0bserver

@ The0bserver 이것은 저에게도 효과적이었습니다. 컨트롤러 클래스 상단에 HttpPrefix데코레이터가 있고 개별 엔드 포인트에 대해 데코레이터 가 있기 때문에 진단하기가 어렵습니다 [Route("/")]. 경로에 빈 문자열을 전달하면 문제가 해결되었습니다.
David

1
도움이되어 다행입니다. :)
0bserver

7

이 오류가 "지금"나오는 경우 경우 (예 : 앱이 한동안 완벽하게 작동하는 경우) 스스로에게 물어보십시오.이 오류를보기 전에 컨트롤러에 작업을 추가했거나 경로를 변경 했습니까?

대답이 예인 경우 (아마도 가능) 프로세스에서 실수를 한 것 같습니다. 잘못된 형식 지정, 조치 복사 / 붙여 넣기 및 엔드 포인트 이름의 고유 한 확인 등을 잊어 버리는 경우가 있습니다. 이 오류가 해결 방법에 대한 제안은 잘못된 트리를 짖을 수 있습니다.


이것은 정확히 나에게 일어난 일입니다. 경로를 변경했지만 다음과 같이 끝에 잘못된 중괄호를 남겼습니다. [Route ( "GetStuff}")]
Stu Price

2

요구

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

전에

GlobalConfiguration.Configure(c => ...);

실행을 완료합니다.


2

메인 프로젝트에서 Newtonsoft.Json 버전이 도우미 프로젝트와 다를 때이 오류가 발생했습니다.


빠른 추가 : 참조 문제를 해결 한 후 솔루션을 정리하고 최종 배포 된 DLL이 올바른 버전인지 다시 확인하십시오.)
Marcel

1

"속성 라우팅"의 경로 템플릿이 올바르지 않은 경우 일반적으로이 예외가 발생합니다.

예를 들어 다음 코드를 작성할 때 이것을 얻었습니다.

[Route("{dirName:string}/contents")] //incorrect
public HttpResponseMessage GetDirContents(string dirName) { ... }

경로 제약 조건 구문 {parameter : constraint}에서 기본적으로 제약 조건은 string 유형 입니다. 명시 적으로 언급 할 필요가 없습니다.

[Route("{dirName}/contents")] //correct
public HttpResponseMessage GetDirContents(string dirName) { ... }

0

나는 언젠가이 오류가 발생하기 시작했다. 전화하도록 앱을 변경 한 후 EnsureInitialized()근본 원인을 확인할 수있었습니다.

액션에 대한 사용자 정의 속성, 필터가 있습니다. 이 속성 클래스는 NuGet 패키지가 크게 변경되었습니다.

코드를 업데이트하고 모두 컴파일했지만 로컬 IIS 작업자는 오래된 DLL을로드하고 초기화 중에 클래스 멤버를 찾지 않고 동작 등의 속성을 읽었습니다.

어떤 이유로 (아마도 주문 / 로깅이 초기화되었을 때),이 오류를 발견 할 수 없었기 때문에 WebAPI를 이상한 상태로 남길 EnsureInitialized()수 있습니다.

편리한 스크립트를 통해 적절 bin하고 obj깨끗하게 수행하면 문제가 해결되었습니다.


0

내 경우에는 프로젝트 A에서 웹 서비스를 만들고 프로젝트 B에서 시작했으며 정확히이 오류가 발생했습니다. 문제는 B의 빌드-출력 폴더에서 누락 된 A에 필요한 일부 .dll 파일입니다. 이러한 .dll 파일이 사용 가능한지 확인하십시오.


0

내 경우에는 '스키마'가 누락 된 작업의 매개 변수로 Entity를 사용했습니다.

잘못된 속성 :

[Table("Table name", Schema = "")]

맞음 :

[Table("Table name", Schema = "schema name")]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.