WebApi में Header मान कैसे जोड़ें और प्राप्त करें


99

मुझे WebApi में एक POST विधि बनाने की आवश्यकता है ताकि मैं WebApi पद्धति से डेटा भेज सकूं। मैं हेडर मान प्राप्त करने में सक्षम नहीं हूं।

यहाँ मैंने आवेदन में हेडर मान जोड़ा है:

 using (var client = new WebClient())
        {
            // Set the header so it knows we are sending JSON.
            client.Headers[HttpRequestHeader.ContentType] = "application/json";

            client.Headers.Add("Custom", "sample");
            // Make the request
            var response = client.UploadString(url, jsonObj);
        }

WebApi पोस्ट विधि के बाद:

 public string Postsam([FromBody]object jsonData)
    {
        HttpRequestMessage re = new HttpRequestMessage();
        var headers = re.Headers;

        if (headers.Contains("Custom"))
        {
            string token = headers.GetValues("Custom").First();
        }
    }

हेडर मान प्राप्त करने की सही विधि क्या है?

धन्यवाद।

जवाबों:


186

वेब एपीआई की तरफ, बस नई HttpRequestMessage बनाने के बजाय अनुरोध ऑब्जेक्ट का उपयोग करें

     var re = Request;
    var headers = re.Headers;

    if (headers.Contains("Custom"))
    {
        string token = headers.GetValues("Custom").First();
    }

    return null;

आउटपुट -

यहां छवि विवरण दर्ज करें


क्या आप उपयोग नहीं कर सकते string token = headers.GetValues("Custom").FirstOrDefault();? संपादित करें: आपने देखा कि आप मूल Qs शैली से मेल खा रहे हैं।
एडनपॉवर्ड

मेरे अपने प्रश्न का उत्तर देना: नहीं headers.GetValues("somethingNotFound")एक फेंकता है InvalidOperationException
एडनपॉवर्ड

क्या मैं beforeSendशीर्ष लेख भेजने के लिए JQuery के AJAX में उपयोग करता हूं ?
Si8

बिल्कुल सही ... मैंने इसका इस्तेमाल किया beforeSendऔर यह काम किया। विस्मयकारी :) +1
Si8

अनुरोध चर का प्रकार क्या है और क्या मैं इसे नियंत्रक विधि के अंदर एक्सेस कर सकता हूं? मैं वेब एपीआई 2 का उपयोग कर रहा हूं। मुझे आयात करने के लिए कौन से नामस्थान की आवश्यकता है?
लोहिराहुल

21

मान लीजिए कि हमारे पास एपीआई कंट्रोलर प्रोडक्ट कंट्रोलर है: एपीकंट्रोलर

एक फ़ंक्शन प्राप्त होता है जो कुछ मान लौटाता है और कुछ इनपुट हेडर की उम्मीद करता है (उदाहरण के लिए। उपयोगकर्ता नाम और पासवर्ड)

[HttpGet]
public IHttpActionResult GetProduct(int id)
{
    System.Net.Http.Headers.HttpRequestHeaders headers = this.Request.Headers;
    string token = string.Empty;
    string pwd = string.Empty;
    if (headers.Contains("username"))
    {
        token = headers.GetValues("username").First();
    }
    if (headers.Contains("password"))
    {
        pwd = headers.GetValues("password").First();
    }
    //code to authenticate and return some thing
    if (!Authenticated(token, pwd)
        return Unauthorized();
    var product = products.FirstOrDefault((p) => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    return Ok(product);
}

अब हम JQuery का उपयोग करके पेज से अनुरोध भेज सकते हैं:

$.ajax({
    url: 'api/products/10',
    type: 'GET',
    headers: { 'username': 'test','password':'123' },
    success: function (data) {
        alert(data);
    },
    failure: function (result) {
        alert('Error: ' + result);
    }
});

उम्मीद है कि यह किसी की मदद करता है ...


9

एक और तरीका एक TryGetValues ​​विधि का उपयोग कर।

public string Postsam([FromBody]object jsonData)
{
    IEnumerable<string> headerValues;

    if (Request.Headers.TryGetValues("Custom", out headerValues))
    {
        string token = headerValues.First();
    }
}   

6

.NET कोर के लिए:

string Token = Request.Headers["Custom"];

या

var re = Request;
var headers = re.Headers;
string token = string.Empty;
StringValues x = default(StringValues);
if (headers.ContainsKey("Custom"))
{
   var m = headers.TryGetValue("Custom", out x);
}

6

यदि कोई व्यक्ति मॉडल बाइंडिंग के लिए ASP.NET Core का उपयोग कर रहा है,

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

[FromHeader] विशेषता का उपयोग करके हेडर से मान प्राप्त करने के समर्थन में बनाया गया है

public string Test([FromHeader]string Host, [FromHeader]string Content-Type )
{
     return $"Host: {Host} Content-Type: {Content-Type}";
}

3
Content-Typeएक मान्य C # पहचानकर्ता नहीं है
thepirat000

5

मेरे मामले में काम करने वाली कोड की इन पंक्तियों को आज़माएँ:

IEnumerable<string> values = new List<string>();
this.Request.Headers.TryGetValues("Authorization", out values);

5

जैसा कि किसी ने पहले ही बताया है कि .Net कोर के साथ ऐसा कैसे किया जाता है, यदि आपके हेडर में "-" या कुछ अन्य वर्ण .Net शामिल हैं, तो आप कुछ ऐसा कर सकते हैं:

public string Test([FromHeader]string host, [FromHeader(Name = "Content-Type")] string contentType)
{
}

1

वेब एपीआई 2.0 के लिए:

मुझे Request.Content.Headersइसके बजाय उपयोग करना था Request.Headers

और फिर मैं नीचे के रूप में एक घोषणा की घोषणा की

  /// <summary>
    /// Returns an individual HTTP Header value
    /// </summary>
    /// <param name="headers"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static string GetHeader(this HttpContentHeaders headers, string key, string defaultValue)
    {
        IEnumerable<string> keys = null;
        if (!headers.TryGetValues(key, out keys))
            return defaultValue;

        return keys.First();
    }

और फिर मैंने इसे इस तरह से लागू किया।

  var headerValue = Request.Content.Headers.GetHeader("custom-header-key", "default-value");

मुझे उम्मीद है कि यह मददगार हो सकता है


0

आपको वर्तमान ऑपरेशनकॉन्टेक्स से HttpRequestMessage प्राप्त करने की आवश्यकता है। OperationContext का उपयोग करके आप ऐसा कर सकते हैं

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;

HttpRequestMessageProperty requestProperty = messageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;

string customHeaderValue = requestProperty.Headers["Custom"];

0

GET विधि में .net Core के लिए, आप इस तरह कर सकते हैं:

 StringValues value1;
 string DeviceId = string.Empty;

  if (Request.Headers.TryGetValue("param1", out value1))
      {
                DeviceId = value1.FirstOrDefault();
      }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.