2014-10-09 1 views
1

기본값을 사용하여 개발 된 작동중인 web-api 2 응용 프로그램이 있습니다. 그것은 app.dll에 있습니다.Owin/Katana 셀프 호스팅 시나리오에 대한 별도 dll의 웹 API 코드

이제는 Katana를 사용하여이 애플리케이션을 자체 호스팅하는 새로운 콘솔 앱 프로젝트를 추가하려고합니다. 나는 참고로 app.dll을 추가했다. 문제는, 내가이 자체 호스팅 애플 리케이션을 실행하고 API에 간단한 요청을 보내려고하면, 그것은 어떤 컨트롤러를 찾을 수 없다는 것입니다. 다음과 같은 오류 메시지가 나타납니다. No type was found that matches the controller named 'MyController'.

이제 컨트롤러를 찾기 위해 this way을 사용하려고합니다. 하지만 분명히 GetAssemblies()의 코드가 호출되지 않으므로 잘못된 작업을 수행하고 있습니다.

코드 샘플

은 다음과 같습니다 :

public class Startup 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Services.Replace(typeof (IAssembliesResolver), new AssembliesResolver()); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     );app 
     appBuilder.UseWebApi(config); 
    } 
} 

public class AssembliesResolver : DefaultAssembliesResolver 
{ 
    public override ICollection<Assembly> GetAssemblies() 
    { 
     ICollection<Assembly> baseAssemblies = base.GetAssemblies(); 
     List<Assembly> assemblies = new List<Assembly>(baseAssemblies); 
     var controllersAssembly = Assembly.LoadFrom(@"app.dll"); 
     baseAssemblies.Add(controllersAssembly); 
     return assemblies; 
    } 
} 

답변

3

는 ApiControllers와 실제 프로젝트에서 새로운 AssemblyResolver 클래스를 만들어보십시오. 그런 다음 이것을 사용하여 어셈블리를 가져옵니다.

public override ICollection<Assembly> GetAssemblies() 
    { 
     return new List<Assembly> 
     { 
      typeof (AssembliesResolver).Assembly 
     }; 
    } 

이것은 단지 단일 DLL에만 ApiControllers가 있다고 가정합니다.