Sadece bunu yapmaya çalışırken bir alıştırma yaptım. Ne yazık ki, başlangıçtan sonra Katana tabanlı bir ana bilgisayara doğrudan middleware enjekte etmenin bir yolu yoktur. Bunun nedeni, middleware'in gerçekte kullanılması için, application delegate'a birlikte oluşturulması gerektiğidir. Katana'nın uygulaması, IAppBuilder.Build(typeof(AppFunc))
numaralı telefonu arayarak, AppFunc
uygulama başlatma için belirtilen türde bir takma ad kullanıyor: Func<IDictionary<string,object>, Task>
Başlatma tamamlandığında. İşte .Initialize
altındaki anahtar çizgi:
AppFunc = (AppFunc)builder.Build(typeof(AppFunc));
Eğer ortakatmanını yapılandırmak zorunda tek fırsat yazdığınız başlangıç sınıfında veya web.config
tarafından yapılandırma adımı sırasında, bu öncedir.
Sadece eser, böyle bir şey ile deneme değildi ne olacağına dair çok net olması: Bu istisnalar atmak değildir ve hataların belirgin işaretler
public class Startup
{
public void Configuration(IAppBuilder app)
{
HomeController.Initialized +=() => ConfigureGoogle(app);
}
private void ConfigureGoogle(IAppBuilder app)
{
app.UseGoogleAuthentication(/* stuff */);
}
}
public class HomeController : Controller
{
public event EventHandler Initialized;
[Route("/setup/submit"), AcceptVerbs(HttpVerbs.Post)]
public ActionResult SetupSubmit()
{
/* ... */
Initialized();
}
}
- ama işe yaramaz çünkü uygulama temsilcisi zaten bu noktadan oluşuyordu. Katana, uygulama temsilcisini yeniden oluşturmak için size herhangi bir API vermez (ve bunun zaten iyi bir fikir olacağından emin değilim - böyle bir mekanizma tarafından yaratılabilecek sayısız hata olabilir, örneğin; Sunucunun başlatılmasından sonra uygulama temsilcisi yeniden oluşturulduğunda sunucu bir uçuş isteğini işliyor mu?).
Senin alternatifin nedir? DavidFahlander'in yaklaşımı doğru olanı olacak, ancak dinamizme ulaşmak için hala dikkatli olmanız gerekiyor. .MapWhen
ne bak:
// put middleware in pipeline before creating branch
var options = new MapWhenOptions { Predicate = predicate };
IAppBuilder result = app.Use<MapWhenMiddleware>(options);
// create branch and assign to options
IAppBuilder branch = app.New();
configuration(branch);
options.Branch = (AppFunc)branch.Build(typeof(AppFunc));
Birincisi, bu bir MapWhenMiddleware
tip app.Use
çağırır dikkat edin. Bu, daha önce olduğu gibi aynı sınırlamalarla karşı karşıya olduğunuz anlamına gelir - her şey ön tarafta yapılmalıdır. Başlatma tamamlanmadan önce dallı ara katman da pişirilir: son satırına bakın: branch.Build
.
Tek dinamizm umudunuz, yüklemleri amacınıza ulaşacak şekilde kullanmaktır. Bu size orada yol% 100 almaz, ama yakın oldukça lanetlemek alır:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapWhen(ctx => ClientHasWsFederationConfigured() && ctx.Request.Headers.Get("Host").Equals("customer1.cloudservice.net"), app2 =>
{
app2.UseWsFederationAuthentication(...);
});
app.MapWhen(ctx => ClientHasGoogleAuthConfigured() && ctx.Request.Headers.Get("Host").Equals("customer2.cloudservice.net"), app2 =>
{
app2.UseGoogleAuthentication(...);
});
}
}
sınırlamalar burada bunlar olacak: Sen tüm desteklenen kimlik doğrulama türlerini yapılandırmak zorunda
- -ön. Uygulama çalışırken yeni bir tane ekleyemezsiniz. Her istekte
ClientHasXXXConfigured
çalışır. Bu, ne yaptığınıza bağlı olarak, performans bazında kabul edilebilir veya kabul edilmeyebilir.
söz konusu koymak bilgilerden yola, sana ClientHasXXXConfigured
(veya eşdeğer) ne hakkında dikkatli konum olarak bu ödünleşmeler sürece muhtemelen Tamam olduğunu düşünüyorum.
Bu konuyla ilgili birkaç yazıyla karşılaştım. Sadece bununla nasıl gittiğini merak ederek, uygulamadaki appID ve ilişkili sırrı değiştirmem gerekiyor. Owin, zamanın başlangıcında başlatıldığından, denetleyicideki hiçbir şeyi değiştiremiyorum. – user3836415