2013-08-09 2 views
0

다음은 증상 내가 경험하고 있습니다내 컨트롤러가 호출되지 않을 때 왜 인스턴스화됩니까?

나는 지역에 새로운 빈 컨트롤러가 :

public class JamController : Controller 
{ 
    public JamController() 
    { 
     throw new Exception("Not implemented!"); 
    } 

내가 http://myprojectserver.example.com:12345/urlthatdoesnotexist를 방문하면, 나는 다음과 같은 오류 얻을 :

[CompositionException: The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information. 

1) Not implemented! 

Resulting in: An exception occurred while trying to create an instance of type 'MyWebProject.Areas.Users.Controllers.JamController'. 

Resulting in: Cannot activate part 'MyWebProject.Areas.Users.Controllers.JamController'. 
Element: MyWebProject.Areas.Users.Controllers.JamController --> MyWebProject.Areas.Users.Controllers.JamController 

Resulting in: Cannot get export 'MyWebProject.Areas.Users.Controllers.JamController (ContractName="System.Web.Mvc.IController")' from part 'MyWebProject.Areas.Users.Controllers.JamController'. 
Element: MyWebProject.Areas.Users.Controllers.JamController (ContractName="System.Web.Mvc.IController") 
] 
    System.ComponentModel.Composition.Hosting.CompositionServices.GetExportedValueFromComposedPart(ImportEngine engine, ComposablePart part, ExportDefinition definition) +55 
    System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportedValue(CatalogPart part, ExportDefinition export, Boolean isSharedPart) +78 
    System.ComponentModel.Composition.Hosting.CatalogExport.GetExportedValueCore() +47 
    System.ComponentModel.Composition.Primitives.Export.get_Value() +57 
    System.ComponentModel.Composition.ExportServices.GetCastedExportedValue(Export export) +40 
    System.ComponentModel.Composition.<>c__DisplayClassa`1.<CreateStronglyTypedLazyOfT>b__6() +39 
    System.Lazy`1.CreateValue() +416 
    System.Lazy`1.LazyInitValue() +382 
    System.Lazy`1.get_Value() +75 
    MefContrib.Web.Mvc.<>c__DisplayClass4.<GetControllerType>b__0(Lazy`1 e) +53 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +204 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 
    MefContrib.Web.Mvc.CompositionControllerFactory.GetControllerType(RequestContext requestContext, String controllerName) +412 
    System.Web.Mvc.DefaultControllerFactory.System.Web.Mvc.IControllerFactory.GetControllerSessionBehavior(RequestContext requestContext, String controllerName) +61 
    System.Web.Mvc.MvcRouteHandler.GetSessionStateBehavior(RequestContext requestContext) +122 
    System.Web.Mvc.MvcRouteHandler.GetHttpHandler(RequestContext requestContext) +33 
    System.Web.Mvc.MvcRouteHandler.System.Web.Routing.IRouteHandler.GetHttpHandler(RequestContext requestContext) +10 
    System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase context) +9709884 
    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) +699 

제 질문은 "왜?" 왜이 컨트롤러를 인스턴스화하려고합니까? 이 문제를 일으키는 원인을 확인하려면 어디에서보아야합니까? 나는 "페이지를 찾을 수 없습니다"에서 모든 컨트롤러를 인스턴스화하는 것은 예상 된 동작이 아니라고 확신합니다.

나는 어디를 봐야할지 모르겠다. 누군가가 도움이 될 방향으로 나를 가리킬 수 있습니까?

UPDATE : 섹션 내 문제를 해결합니다 "컨트롤러에서 종속성을 해결하기 위해 MVC3에게"없이 주석 처리

// Tell MVC3 to use MEF as its dependency resolver. 
var dependencyResolver = new CompositionDependencyResolver(catalog); 
DependencyResolver.SetResolver(dependencyResolver); 

// Tell MVC3 to resolve dependencies in controllers 
ControllerBuilder.Current.SetControllerFactory(
    new CompositionControllerFactory(
     new CompositionControllerActivator(dependencyResolver))); 

:

가 SetControllerFactory 방법은 아래의 문제를 일으키는 것으로 밝혀 내가 요청한 컨트롤러를 제외한 컨트롤러는 인스턴스화됩니다. 다행히 표준 Asp.Net 컨트롤러 해상도를 사용하지 않는 경우에만 필요합니다.

+1

언제든지 해당 동작에 중단 점을 배치하고 스택 추적을 볼 수 있습니다. –

+1

라우팅이 엉망이 되었습니까? – Leri

+0

@Brad 스택 추적을 시도했습니다. 그것은 바로 System.ComponentModel.Composition으로 뛰어 들었고 어떤 사용자 코드도 건드리지 않았습니다. – Jonathan

답변

2

이것은 버그입니다. MefContrib.Web.Mvc. 이 어셈블리는 DefaultControllerFactory에서 상속받은 자체 ControllerFactory를 구현합니다.

GetControllerType, 기본 응용 프로그램이나 참조가 아닌 다른 곳에있는 어셈블리에있는 컨트롤러를 해결하려고합니다. GetControllerType 구현은 먼저 base.GetControllerType으로 호출하여 Defaultcontroller가 해결할 수 있는지 확인합니다.

존재하지 않는 URL의 경우 불가능한 경우 IController를 구현하는 모든 내보내기에 대해 MEF에 요청합니다. IEnumerable < 지연된 <IController> > (기본적으로) bin/폴더에 IController를 구현하는 모든 클래스에 대해 하나의 항목이 반환됩니다.

그것은 다음 각 게으른 <IController>의 Value 속성에 GetType을()를 호출의 IEnumerable을 통해 LINQ 쿼리를 실행합니다. 게으름의 값을 요청하면 <T> 인스턴스가 생성됩니다. 이것이 bin /에있는 모든 컨트롤러가 존재하지 않는 페이지에 대해 구성되는 이유입니다.

값을 만들지 않고 게으름 <T>.Value에서 Type 인스턴스를 가져올 방법이 없기 때문에이 문제를 올바르게 수정하는 것이 쉽지 않다고 생각합니다. 그러나 Asp.Net을 사용하여 ControllerFactory를 등록하는 AppStart_MefContribMVC3.cs에서 선을 제거함으로써 - 실제로 MefContrib.Web.Mvc의 ControllerFactory 사용을 중단하고 대신 Asp.Net의 DefaultControllerFactory를 사용했습니다.

0

는 SetControllerFactory 방법은 아래의 문제의 원인이되는 것으로 밝혀 : 주석 처리

// Tell MVC3 to use MEF as its dependency resolver. 
var dependencyResolver = new CompositionDependencyResolver(catalog); 
DependencyResolver.SetResolver(dependencyResolver); 

// Tell MVC3 to resolve dependencies in controllers 
ControllerBuilder.Current.SetControllerFactory(
    new CompositionControllerFactory(
     new CompositionControllerActivator(dependencyResolver))); 

을 섹션 내 문제를 해결합니다 "컨트롤러에서 종속성을 해결하기 위해 MVC3에게"내가 인스턴스화 요청을 제외한 어떤 컨트롤러가 없다 . 다행히 표준 Asp.Net 컨트롤러 해상도를 사용하지 않는 경우에만 필요합니다.

관련 문제