2013-03-04 6 views
16

एएसपी.नेट 4.5 एमवीसी 4 वेब एपीआई प्रोजेक्ट में, मैं एक कस्टम HttpMessageHandler जोड़ना चाहता हूं। इस प्रकार मैं (\ App_Satrt \ WebApiConfig.cs में) WebApiConfig वर्ग बदल दिया है,:वेब एपीआई में HttpMessageHandler को कैसे कार्यान्वित करें?

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional }, 
      constraints: null, 
      handler: new MyCustomizedHttpMessageHandler() 
     ); 
    } 
} 

तब मैं MyCustomizedHttpMessageHandler विकसित:

public class MyCustomizedHttpMessageHandler : HttpMessageHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     IPrincipal principal = new GenericPrincipal(
      new GenericIdentity("myuser"), new string[] { "myrole" }); 
     Thread.CurrentPrincipal = principal; 
     HttpContext.Current.User = principal; 

     return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse()); 
    } 
} 

हालांकि, एपीआई के लिए अनुरोध (मान लीजिए कि http://mylocalhost.com/api/values हैं) , किसी भी डेटा के बिना हमेशा स्टेटस कोड 200 लौटाता है। मेरा मतलब है कि यह ValuesController.cs की 'GET()' विधि को कभी नहीं मिलता है।

मुझे क्या याद आया? मैं HttpMessageHandler को ठीक से कैसे कार्यान्वित कर सकता हूं?

पीएस: पहले से ही इसे पढ़ चुके हैं: https://stackoverflow.com/a/12030785/538387, मेरी मदद नहीं करता है।

उत्तर

22

यहां आप HttpMessageHandler बना रहे हैं जो अनुरोध को संक्षिप्त सर्किट करता है और अनुरोध को शेष पाइपलाइन के माध्यम से पारित नहीं करता है। इसके बजाय, आपको DelegatingHandler बनाना चाहिए।

वेब एपीआई में 2 प्रकार के संदेश हैंडलर पाइपलाइन भी हैं। एक नियमित पाइपलाइन है जिसमें सभी मार्गों के लिए सभी अनुरोध पारित होते हैं और अन्य जहां किसी के पास केवल कुछ मार्गों के लिए संदेश हैंडलर हो सकते हैं।

  1. कोशिश एक DelegatingHandler बनाते हैं और अपने HttpConfiguration के संदेश संचालकों की सूची में जोड़ने के लिए:

    config.MessageHandlers.Add(new HandlerA()) 
    
  2. आप एक मार्ग विशेष संदेश हैंडलर जोड़ना चाहते हैं, तो आप कर सकता है निम्नलिखित :

    config.Routes.MapHttpRoute(
          name: "DefaultApi", 
          routeTemplate: "api/{controller}/{id}", 
          defaults: new { id = RouteParameter.Optional }, 
          constraints: null, 
          handler: 
            HttpClientFactory.CreatePipeline(
              new HttpControllerDispatcher(config), 
              new DelegatingHandler[]{new HandlerA()}) 
          ); 
    

This Web Api Poster Pipeli से पता चलता नी प्रवाह

+0

धन्यवाद। समाधान (1) अच्छी तरह से काम करता है। लेकिन नंबर 2, 'नया एचटीपी कंट्रोलर डिस्पैचर()' कहता है: ** System.Web.Http.Dispatcher.HttpController डिस्पैचर में कोई कन्स्ट्रक्टर नहीं है जो 0 तर्क लेता है ** - अद्यतन: मैंने आपका कोड तय किया है। धन्यवाद। – Tohid

+0

मैंने अपनी उपरोक्त पोस्ट भी अपडेट की। धन्यवाद। –

+0

कृपया अपने उत्तर में कुओंग ले के उत्तर का यह हिस्सा भी जोड़ें: ** एक कस्टम संदेश हैंडलर लिखने के लिए, आपको 'System.Net.Http.DelegatingHandler' से प्राप्त होना चाहिए। ** – Tohid

11

एक कस्टम संदेश हैंडलर लिखने के लिए, आप से System.Net.Http.DelegatingHandler

class CustomMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> 
     SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     IPrincipal principal = new GenericPrincipal(
      new GenericIdentity("myuser"), new string[] { "myrole" }); 
     Thread.CurrentPrincipal = principal; 
     HttpContext.Current.User = principal; 

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

निकाले जाते हैं और आंतरिक हैंडलर के लिए अनुरोध भेजने के लिए base.SendAsync फोन करना चाहिए।

+2

@ कुंज ली - उत्तर के लिए धन्यवाद। आपके कोड के साथ 'CustomMessageHandler' को प्रतिस्थापित करने के बाद, यह' वापसी आधार पर त्रुटि बढ़ाता है। SendAsync (अनुरोध, रद्दीकरण टोकन); 'कह रहा है: ** आंतरिक हैंडलर असाइन नहीं किया गया है। **। मुझे फिर से क्या याद आया? – Tohid

+0

@ लाउंज ली - आपके उत्तर और किरण चैलेंज के संयोजन ने इस मुद्दे को ठीक कर दिया है। फिर से धन्यवाद। – Tohid

+0

@ क्यूओंग ले .NET 4.0 के बराबर क्या है? मुझे .NET44 के लिए DelegatingHandler नहीं मिल सका ... 4.0 में संदेश प्रबंधन कैसे कर सकता है। आपकी सहायता के लिए धन्यवाद. – jaxxbo

संबंधित मुद्दे