Cara menambah dan mendapatkan nilai Header di WebApi


100

Saya perlu membuat metode POST di WebApi sehingga saya dapat mengirim data dari aplikasi ke metode WebApi. Saya tidak bisa mendapatkan nilai header.

Di sini saya telah menambahkan nilai header dalam aplikasi:

 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);
        }

Mengikuti metode posting 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();
        }
    }

Apa metode yang benar untuk mendapatkan nilai header?

Terima kasih.

Jawaban:


187

Di sisi API Web, cukup gunakan objek Request alih-alih membuat HttpRequestMessage baru

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

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

    return null;

Keluaran -

masukkan deskripsi gambar di sini


Bisakah kamu tidak menggunakan string token = headers.GetValues("Custom").FirstOrDefault();? Edit: Baru saja mengetahui Anda mencocokkan gaya Qs asli.
Aidanapword

Menjawab saya sendiri T: Tidak. headers.GetValues("somethingNotFound")Lemparan itu InvalidOperationException.
Aidanapword

Apakah saya menggunakan beforeSendajax di JQuery untuk mengirim header?
Si8

Sempurna ... Saya menggunakan beforeSenddan berhasil. Luar biasa :) +1
Si8

apa jenis variabel Request dan dapatkah saya mengaksesnya di dalam metode pengontrol? Saya menggunakan api web 2. Namespace apa yang perlu saya impor?
lohiarahul

22

Misalkan kita memiliki ProductsController API Controller: ApiController

Ada fungsi Get yang mengembalikan beberapa nilai dan mengharapkan beberapa input header (misalnya UserName & Password)

[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);
}

Sekarang kita dapat mengirim permintaan dari halaman menggunakan JQuery:

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

Semoga ini membantu seseorang ...


9

Cara lain menggunakan metode TryGetValues.

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

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

6

Untuk .NET Core:

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

Atau

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);
}


5

coba baris kode ini yang berfungsi dalam kasus saya:

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

5

Seperti yang telah ditunjukkan oleh seseorang tentang cara melakukan ini dengan .Net Core, jika header Anda berisi "-" atau karakter lain yang tidak diizinkan oleh .Net, Anda dapat melakukan sesuatu seperti:

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

1

Untuk WEB API 2.0:

Saya harus menggunakan Request.Content.Headerssebagai gantinya Request.Headers

dan kemudian saya menyatakan extestion seperti di bawah ini

  /// <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();
    }

Dan kemudian saya memanggilnya dengan cara ini.

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

Saya harap ini bisa membantu


0

Anda perlu mendapatkan HttpRequestMessage dari OperationContext saat ini. Menggunakan OperationContext Anda bisa melakukannya seperti itu

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

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

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

0

Untuk .net Core dalam metode GET, Anda dapat melakukan seperti ini:

 StringValues value1;
 string DeviceId = string.Empty;

  if (Request.Headers.TryGetValue("param1", out value1))
      {
                DeviceId = value1.FirstOrDefault();
      }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.