मैं बस इसे ठीक करने की कोशिश में एक अभ्यास के माध्यम से चला गया। दुर्भाग्यवश, स्टार्टअप के बाद कटाना-आधारित होस्ट में सीधे मिडलवेयर इंजेक्ट करने का कोई तरीका नहीं है। इसका कारण यह है कि मिडलवेयर का वास्तव में उपयोग करने के लिए, इसे application delegate में एक साथ बनाया जाना चाहिए। कटाना का कार्यान्वयन IAppBuilder.Build(typeof(AppFunc))
पर कॉल करके करता है, जहां AppFunc
एप्लिकेशन प्रतिनिधि के लिए निर्दिष्ट प्रकार का उपयोग उपनाम है: प्रारंभ होने पर Func<IDictionary<string,object>, Task>
। यहाँ .Initialize
के निचले भाग में प्रमुख लाइन है:
AppFunc = (AppFunc)builder.Build(typeof(AppFunc));
केवल अवसर आप मिडलवेयर कॉन्फ़िगर करने के लिए है, इस से पहले है स्टार्टअप वर्ग आप लिखते हैं या web.config
द्वारा विन्यास चरण के दौरान।
बस क्या काम करते हैं, मैं कुछ इस तरह के साथ प्रयोग किया गया था नहीं होगा के बारे में बहुत स्पष्ट होना:
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();
}
}
यह अपवाद फेंक नहीं है, और वहाँ त्रुटियों की कोई स्पष्ट संकेत हैं - लेकिन यह काम नहीं करता है क्योंकि आवेदन प्रतिनिधि पहले ही इस बिंदु से बना है। कटाना आपको एप्लिकेशन प्रतिनिधि को फिर से बनाने के लिए कोई एपीआई नहीं देती है (और मुझे यकीन नहीं है कि वैसे भी एक अच्छा विचार होगा - ऐसे तंत्र द्वारा बनाई जा सकने वाली अनगिनत बग होगी; उदाहरण के लिए, कैसे होना चाहिए जब सर्वर प्रतिनिधि को प्रारंभिकरण के बाद पुन: संयोजित किया जाता है तो सर्वर एक इन-फ्लाइट अनुरोध संभालता है?)।
आपका विकल्प क्या है? @ डेविडफहलैंडर का दृष्टिकोण सही होगा, लेकिन यदि आप गतिशीलता प्राप्त करना चाहते हैं तो आपको अभी भी सावधान रहना होगा। .MapWhen
क्या करता है को देखो:
// 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));
सबसे पहले, ध्यान दें कि यह एक MapWhenMiddleware
प्रकार के साथ कॉल app.Use
। इसका मतलब है कि आप पहले की तरह ही सीमाओं का सामना कर रहे हैं - यह सब सामने किया जाना है। प्रारंभिकरण पूर्ण होने से पहले ब्रांडेड मिडलवेयर भी बेक किया जाएगा: अंतिम पंक्ति देखें: branch.Build
।
गतिशीलता की आपकी एकमात्र आशा भविष्यवाणियों का उपयोग इस तरह से करना है जिससे आपका लक्ष्य प्राप्त हो सके। यह आपको इस प्रक्रिया की 100% नहीं मिलता है, लेकिन यह बहुत रफ़ू करीब हो जाता है: यहाँ
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(...);
});
}
}
सीमाओं इन किया जाएगा:
- आप अपने सभी समर्थित प्रमाणीकरण प्रकार के कॉन्फिगर करना -front। ऐप चल रहा है, जबकि आप एक नया जोड़ नहीं सकते हैं।
ClientHasXXXConfigured
प्रत्येक अनुरोध पर चलाया जाएगा। आप जो करते हैं उसके आधार पर, प्रदर्शन के आधार पर यह स्वीकार्य हो सकता है या नहीं भी हो सकता है।
जानकारी आप सवाल में डाल को देखते हुए, मुझे लगता है कि इन समझौतों से के रूप में आप क्या ClientHasXXXConfigured
(या इसके बराबर है) करता है के बारे में सावधान कर रहे हैं जब तक ठीक शायद कर रहे हैं।
मैं इस विषय के बारे में आपकी कुछ पोस्टों में आया हूं। बस सोच रहा है कि आप इसके साथ कैसे गए, मुझे रनटाइम पर एपआईडी और संबंधित रहस्य को बदलने की जरूरत है। चूंकि ओविन समय से पहले शुरू हुआ है, इसलिए मैं नियंत्रक के भीतर कुछ भी संशोधित करने में सक्षम नहीं हूं। – user3836415