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.

AndrewRalon
sumber

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

ramiramilu
sumber
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 ...

Venugopal M
sumber
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();
    }
}   
Schandlich
sumber
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);
}
SaadK
sumber
6

Jika seseorang menggunakan ASP.NET Core untuk pengikatan model,

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

Ada dukungan bawaan untuk mengambil nilai dari header menggunakan atribut [FromHeader]

public string Test([FromHeader]string Host, [FromHeader]string Content-Type )
{
     return $"Host: {Host} Content-Type: {Content-Type}";
}
wonster
sumber
3
Content-Typebukan pengenal C # yang valid
thepirat000
5

coba baris kode ini yang berfungsi dalam kasus saya:

IEnumerable<string> values = new List<string>();
this.Request.Headers.TryGetValues("Authorization", out values);
Sufyan Ahmad
sumber
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)
{
}
Scott
sumber
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

Oscar Emilio Perez Martinez
sumber
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"];
Jehof
sumber
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();
      }
Sharif Yazdian
sumber