8

현재 WCF를 사용하여 REST API를 구현하는 엔터프라이즈 웹 응용 프로그램을 작성 중입니다. VirtualPathProvider를 사용하여 * .svc 파일 (실제로는 존재하지 않음)에 대한 요청을 잡은 다음 관련 파일을 동적으로로드하여 관련 WCF 서비스를 동적으로로드합니다. 이를 통해 시스템은 웹 서버 나 웹 서버를 사용하는 사람에게 영향을주지 않고 런타임에 응용 프로그램에 추가 할 수있는 "모듈"을 가질 수 있습니다.웹 API 2 경로/컨트롤러를 프로그래밍 방식으로로드 할 수 있습니까?

내가 알고 싶은 것은 웹 API 2에서 개념적으로 가능하다는 것입니다. 몇 가지 조사를 해봤지만 경로는 시작할 때만 구성 할 수있는 것처럼 보입니다. for는 존재하지 않는 경로를 처리하는 방법이며 기본적으로 요청에서 컨트롤러 이름을 사용하여 프로그래밍 방식으로 새 경로를 추가하는 동안 연관된 어셈블리가있는 경우 해당 어셈블리를 조회하고로드합니다.

필자는 Web API 2를 시작 했으므로 좀 더 숙련 된 사용자가 필요합니다. 기본적으로 우리 팀은 WCF에서 발생하는 오버 헤드와 복잡성을 줄이기 위해 Web API 2로 전환하는 데 관심이 있습니다. 그러나이 특별한 요구 사항은 거래 차단기가 될 수 있습니다.

+0

여기에도 답변이 있습니다. http://stackoverflow.com/a/39155619/538387 – Tohid

답변

9

좋아요, 많은 연구 끝에 ... 적절한 클래스를 추적하여 컨트롤러가 해결되었는지 여부를 요청할 수 있고 그렇지 않은 경우 제대로로드하려고 시도 할 수 있습니다. 어셈블리를 메모리에 저장하고 (현재 컨트롤러 이름을 기반으로) 연결된 컨트롤러를 반환합니다. 여기

코드입니다 :

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)); 

가 될 확실히 더 많은 작업이 여기서 끝내지 만 이것은 좋은 시작입니다. 작동 중지 상태에서도 가동 중일 때 호스팅 웹 사이트에 컨트롤러를 동적으로 추가 할 수 있습니다.

이 코드의 주요 문제점은 새로로드 된 컨트롤러가 등록 된 컨트롤러 목록에 추가되지 않으므로 예외가 항상 발생하고 해당 컨트롤러에 대한 모든 요청에서 예외가 처리된다는 것입니다. 등록 된 목록에 어떤 식 으로든 추가 할 수 있는지 여부를 조사하고 있으므로이 위치가 어디에서 표시되는지 확인할 것입니다.

관련 문제