8

Şu anda bir REST API uygulamak için WCF kullanan bir kuruluş web uygulaması üzerinde çalışıyorum. * .svc dosyalarına (gerçekte var olmayan) istekleri yakalamak için bir VirtualPathProvider kullanır ve ardından ilgili WCF hizmetlerini dinamik olarak yüklemek için bunları anında oluşturur. Bu, sistemin, web sunucusunu veya onu kullanan herhangi birini etkilemeden, çalışma zamanında uygulamaya eklenebilecek "modüllere" sahip olmasını sağlar.Web API 2 Program/rota denetleyici programlı olarak yüklenebilir mi?

Bilmek istediğim, Web API 2 ile kavramsal olarak aynı durumun söz konusu olması. Bazı araştırmalar yapıyorum, ancak rotaların sadece başlangıçta yapılandırılabildiği görülüyor ... Ne bekliyordum? için var olmayan yollar için işlemek için bir yöntemdir ve temelde programa yeni bir yol eklerken, ilişkilendirilmiş derleme (varsa) yüklemek ve yüklemek için denetleyici adını istekte kullanın.

Web API 2'yi kullanmaya başladım, bu yüzden daha deneyimli bazı kullanıcıların telefon etmesini umuyordum. Temel olarak ekibim, WCF ile karşılaştığımız ek yükü ve karmaşıklığı azaltmak için Web API 2'ye geçmekle ilgileniyor, Ancak bu özel gereksinim bir anlaşma kırıcı olabilir.

+0

Burada da bir cevabım var: http://stackoverflow.com/a/39155619/538387 – Tohid

cevap

9

Pek çok araştırmadan sonra ... geçersiz kılmak için uygun sınıfı izledim ve artık denetleyicinin çözülüp çözülmeyeceğini kontrol edip etmediğini kontrol edebilir ve uygun değilse hafızaya derleme (şu anda denetleyici adına göre) ve ilişkili denetleyiciyi döndür. İşte

kodudur:

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

ve tabii ki gibi WebApiConfig Register yöntemi dosyasında hizmetini yerine getirmeniz gerekir:

config.Services.Replace(typeof(IHttpControllerSelector), new CustomHttpControllerSelector(config)); 

olmak kesinlikle daha iş var Burada bitti, ama bu iyi bir başlangıç. Çalıştırırken barındırma web sitesine dinamik olarak denetleyicileri eklememe izin veriyor, bir kesinti gerektirmeden.

Bu koddaki ana sorun, yeni yüklenen denetleyicinin kayıtlı denetleyiciler listesine eklenmemesidir, bu nedenle istisna her zaman her istek üzerine atılır ve işlenir (bu denetleyiciler için). Bir şekilde kayıtlı listeye ekleyip eklemeyeceğime bakıyorum, bu yüzden nereye gideceğimizi göreceğiz.

İlgili konular