2013-12-16 8 views
6

शीर्षलेख पर मैं कुछ खोजें करने की है, लेकिन कुछ भी खोजने के लिए प्रतीत नहीं किया है ...WebAPI: मानचित्रण पैरामीटर मान

WebAPI का उपयोग करना, मैं एक हैडर मूल्य के लिए एक इनपुट पैरामीटर मैप करने के लिए करना चाहते हैं: उदाहरण के लिए

उदा। नियंत्रक में: ... बल्कि एक URL पैरामीटर से:

public User GetUser(int id){ 
    ... 
    return user; 
} 

मैं WebAPI एक हैडर मूल्य के लिए आईडी पैरामीटर (1234 जैसे एक्स-प्रमाणीकरण) करना चाहते हैं।

क्या यह समर्थित है?

उत्तर

24

मुझे नहीं लगता कि यह बॉक्स से बाहर है, उदाहरण के लिए [FromBody] विशेषता के साथ। ऐसा लगता है कि आप मॉडल बाइंडर्स का उपयोग कर इस कार्यक्षमता को प्राप्त करने में सक्षम होना चाहिए, जैसा कि here वर्णित है। मॉडल बाइंडर में आपके पास अनुरोध और उसके शीर्षलेख तक पहुंच है, इसलिए आपको हेडर पढ़ने और बाध्यकारी कॉन्टैक्ट.मोडेल प्रॉपर्टी पर अपना मान सेट करने में सक्षम होना चाहिए।

संपादित करें: लेख को और पढ़ें, ऐसा लगता है कि एक कस्टम एचटीपी पैरामीटर बाइंडिंग और पैरामीटर बाइंडिंग एट्रिब्यूट एक और उचित समाधान है, या कम से कम मैं इस तरह से जाऊंगा। आप एक सामान्य [FromHeader] विशेषता लागू कर सकते हैं, जो नौकरी करता है। मैं भी एक ही समस्या से लड़ रहा हूं, इसलिए जब मैं इसे जगह लेता हूं तो मैं अपना समाधान पोस्ट करूंगा।

संपादित करें 2:

public class FromHeaderBinding : HttpParameterBinding 
{ 
    private string name; 

    public FromHeaderBinding(HttpParameterDescriptor parameter, string headerName) 
     : base(parameter) 
    { 
     if (string.IsNullOrEmpty(headerName)) 
     { 
      throw new ArgumentNullException("headerName"); 
     } 

     this.name = headerName; 
    } 

    public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     IEnumerable<string> values; 
     if (actionContext.Request.Headers.TryGetValues(this.name, out values)) 
     { 
      actionContext.ActionArguments[this.Descriptor.ParameterName] = values.FirstOrDefault(); 
     } 

     var taskSource = new TaskCompletionSource<object>(); 
     taskSource.SetResult(null); 
     return taskSource.Task; 
    } 
} 

public abstract class FromHeaderAttribute : ParameterBindingAttribute 
{ 
    private string name; 

    public FromHeaderAttribute(string headerName) 
    { 
     this.name = headerName; 
    } 

    public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) 
    { 
     return new FromHeaderBinding(parameter, this.name); 
    } 
} 

public class MyHeaderAttribute : FromHeaderAttribute 
{ 
    public MyHeaderAttribute() 
     : base("MyHeaderName") 
    { 
    } 
} 

तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:

[HttpGet] 
public IHttpActionResult GetItem([MyHeader] string headerValue) 
{ 
    ... 
} 

आशा है कि मदद करता है यहाँ मेरी कार्यान्वयन है।

+1

यह वही है जो मैं ढूंढ रहा था। धन्यवाद। –

+0

क्या [FromHeader ("MyHeader")] आपके कोड के साथ भी काम करेगा? –

3

उत्तर के लिए धन्यवाद filipov .. मैंने अपना कोड लिया और मेरी आवश्यकताओं के अनुरूप इसे थोड़ा सा संशोधित किया। अगर कोई इसका उपयोग कर सकता है तो मैं यहां अपने बदलाव पोस्ट कर रहा हूं।

मैंने 2 बदलाव किए।

  1. मुझे FromHeaderAttribute का विचार पसंद आया, लेकिन उप-वर्गीकरण के बिना। मैंने इस वर्ग को सार्वजनिक किया है, और उपयोगकर्ता को परम नाम सेट करने की आवश्यकता है।

  2. मुझे स्ट्रिंग के अलावा अन्य डेटा प्रकारों का समर्थन करने की आवश्यकता है। इसलिए मैं स्ट्रिंग मान को डिस्क्रिप्टर के पैरामीटर टाइप में कनवर्ट करने का प्रयास करता हूं।

इस तरह यह प्रयोग करें:

[HttpGet] 
public void DeleteWidget(long widgetId, [FromHeader("widgetVersion")] int version) 
{ 
    ... 
} 

और ये मेरे FromHeaderBinding डॉटनैट कोर पर

public class FromHeaderBinding : HttpParameterBinding 
{ 
    private readonly string _name; 

    public FromHeaderBinding(HttpParameterDescriptor parameter, string headerName) 
     : base(parameter) 
    { 
     if (string.IsNullOrEmpty(headerName)) throw new ArgumentNullException("headerName"); 
     _name = headerName; 
    } 

    public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     IEnumerable<string> values; 
     if (actionContext.Request.Headers.TryGetValues(_name, out values)) 
     { 
      var tempVal = values.FirstOrDefault(); 
      if (tempVal != null) 
      { 
       var actionValue = Convert.ChangeType(tempVal, Descriptor.ParameterType); 
       actionContext.ActionArguments[Descriptor.ParameterName] = actionValue; 
      } 
     } 

     var taskSource = new TaskCompletionSource<object>(); 
     taskSource.SetResult(null); 
     return taskSource.Task; 
    } 
} 
+1

स्वाशबकल/स्वैगर का उपयोग करके कार्यान्वयन के लिए भी उपयोगी: http://analogcoder.com/2015/11/how-to-create-header-using-swashbuckle/ – OzBob

2

WebAPI एक अनुरोध से डेटा निकालने के लिए कुछ अतिरिक्त विशेषताएँ हैं गया है। Microsoft.AspNetCore.Mvc.FromHeaderAttribute अनुरोध हेड से पढ़ा जाएगा।

public ActionResult ReadFromHeader([FromHeader(Name = "your-header-property-name")] string data){ 
    //Do something 
} 
संबंधित मुद्दे