2012-11-29 19 views
11

मैं एक कस्टम Delegating हैंडलर जो अनुरोध में & चेकों जवाबी कार्रवाई के लिए कस्टम शीर्षलेख जोड़ लिखा है के लिए विशिष्ट।कस्टम Delegating हैंडलर ASP.NET वेब एपीआई में एक नियंत्रक

मैं WebAPI विन्यास

config.MessageHandlers.Add(new customHandler());

में हैंडल जोड़ा लेकिन समस्या सभी नियंत्रकों के लिए लागू होता है। मुझे नियंत्रकों के लिए विशिष्ट कस्टम हेडर लागू करने की आवश्यकता है। क्या नियंत्रक को विशिष्ट कस्टम हैंडलर जोड़ना संभव है?

उत्तर

15

इस लेख के अंत में यह बताते हैं कि कैसे केवल कुछ मार्गों के लिए संचालकों लागू करने के लिए: http://www.asp.net/web-api/overview/working-with-http/http-message-handlers। आपके नियंत्रक के लिए केवल उस नियंत्रक पर लागू होने के लिए आपको एक अद्वितीय हैंडलर बनाना पड़ सकता है।

config.Routes.MapHttpRoute(
     name: "MyCustomHandlerRoute", 
     routeTemplate: "api/MyController/{id}", 
     defaults: new { controller = "MyController", id = RouteParameter.Optional }, 
     constraints: null, 
     handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA()); 
    ); 

प्रति-मार्ग संदेश संचालकों की पाइप लाइन की तरह, आप here देख सकते हैं इस तरह दिखाई देंगे के बारे में।

+0

लिंक, इसके वास्तव में आत्म व्याख्यात्मक के लिए धन्यवाद। – user1135534

+0

@ किरण-चाल और निक, "विशेषता रूटिंग" के साथ समान कार्य कैसे करें? क्या यह भी संभव है? अंतिम वाक्य में –

+0

मृत लिंक –

5

आप क्या कर सकते हैं प्रति-मार्ग संदेश हैंडलर का उपयोग, लेकिन यहाँ सावधान रहना है। लेख के रूप में @Nick ने अपने उत्तर में लिंक किया है, आप हैंडलर को चेन कर सकते हैं और सुनिश्चित कर सकते हैं कि HttpControllerDispatcher शामिल है। अन्यथा, आप नियंत्रक पाइपलाइन में नहीं पहुंचेंगे।

जो मुझे पसंद है अपने कस्टम हैंडलर के लिए एक आधार वर्ग के रूप में HttpControllerDispatcher उपयोग करने के लिए है एक अन्य विकल्प:

public class CustomerOrdersDispatcher : HttpControllerDispatcher { 

    public CustomerOrdersDispatcher(HttpConfiguration config) 
     : base(config) { 
    } 

    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) { 

     // Do some stuff here... 

     return base.SendAsync(request, cancellationToken); 
    } 
} 

यहाँ, आप इसे कैसे दर्ज किए जाएंगे:

protected void Application_Start(object sender, EventArgs e) { 

    var config = GlobalConfiguration.Configuration; 

    config.Routes.MapHttpRoute(
     name: "CustomerOrdersHttpRoute", 
     routeTemplate: "api/customers/{customerKey}/orders/{key}", 
     defaults: new { controller = "CustomerOrders", key = RouteParameter.Optional }, 
     constraints: null, 
     handler: new CustomerOrdersDispatcher(config) 
    ); 

    config.MessageHandlers.Add(new SomeOtherHandler1()); 
    config.MessageHandlers.Add(new SomeOtherHandler2()); 
} 

SomeOtherHandler1 और SomeOtherHandler2 के बाद निष्पादित किया गया है, CustomerOrdersDispatcherग्राहकऑर्डर HttpRoute मार्ग के लिए निष्पादित किया जाएगा। इसलिए, आप देख सकते हैं कि आप डिफॉल्ट हैंडलर व्यवहार को सुरक्षित रखते हैं और कुछ वैश्विक हैंडलर सेट करते हैं जबकि आपके पास रूट विशिष्ट भी होता है।

यहां मेरे CustomerOrdersDispatcher: https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs का पूर्ण कार्यान्वयन है।

आप यह कैसे काम करता है यह देखने के लिए और साथ ही पूर्ण नमूना आवेदन स्रोत कोड देख सकते हैं: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample