좋아요, 많은 연구 끝에 ... 적절한 클래스를 추적하여 컨트롤러가 해결되었는지 여부를 요청할 수 있고 그렇지 않은 경우 제대로로드하려고 시도 할 수 있습니다. 어셈블리를 메모리에 저장하고 (현재 컨트롤러 이름을 기반으로) 연결된 컨트롤러를 반환합니다. 여기
코드입니다 :
public class CustomHttpControllerSelector : DefaultHttpControllerSelector {
private readonly HttpConfiguration _configuration;
public CustomHttpControllerSelector(HttpConfiguration configuration) : base(configuration) {
_configuration = configuration;
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request) {
HttpControllerDescriptor controller;
try {
controller = base.SelectController(request);
}
catch (Exception ex) {
String controllerName = base.GetControllerName(request);
Assembly assembly = Assembly.LoadFile(String.Format("{0}pak\\{1}.dll", HostingEnvironment.ApplicationPhysicalPath, controllerName));
Type controllerType = assembly.GetTypes()
.Where(i => typeof(IHttpController).IsAssignableFrom(i))
.FirstOrDefault(i => i.Name.ToLower() == controllerName.ToLower() + "controller");
controller = new HttpControllerDescriptor(_configuration, controllerName, controllerType);
}
return controller;
}
}
물론 당신과 같은 WebApiConfig의 등록 방법 파일에 서비스를 교체해야 할 것 :
config.Services.Replace(typeof(IHttpControllerSelector), new CustomHttpControllerSelector(config));
가 될 확실히 더 많은 작업이 여기서 끝내지 만 이것은 좋은 시작입니다. 작동 중지 상태에서도 가동 중일 때 호스팅 웹 사이트에 컨트롤러를 동적으로 추가 할 수 있습니다.
이 코드의 주요 문제점은 새로로드 된 컨트롤러가 등록 된 컨트롤러 목록에 추가되지 않으므로 예외가 항상 발생하고 해당 컨트롤러에 대한 모든 요청에서 예외가 처리된다는 것입니다. 등록 된 목록에 어떤 식 으로든 추가 할 수 있는지 여부를 조사하고 있으므로이 위치가 어디에서 표시되는지 확인할 것입니다.
여기에도 답변이 있습니다. http://stackoverflow.com/a/39155619/538387 – Tohid