วิธีเพิ่มและรับค่าส่วนหัวใน WebApi


103

ฉันต้องการสร้างวิธีการ POST ใน WebApi เพื่อที่ฉันจะได้ส่งข้อมูลจากแอปพลิเคชันไปยังวิธี 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();
        }
    }

วิธีการรับค่าส่วนหัวที่ถูกต้องคืออะไร?

ขอบคุณ.

คำตอบ:


193

ในฝั่ง Web API เพียงแค่ใช้ Request object แทนการสร้าง 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 ดั้งเดิม
Aidanapword

ตอบของตัวเอง Q: หมายเลขพ่นheaders.GetValues("somethingNotFound") InvalidOperationException
Aidanapword

ฉันใช้beforeSendใน JQuery ajax เพื่อส่งส่วนหัวหรือไม่
Si8

สมบูรณ์แบบ ... ฉันใช้beforeSendและได้ผล Awesome :) +1
Si8

ประเภทของตัวแปรคำขอคืออะไรและฉันสามารถเข้าถึงได้จากวิธีการควบคุมหรือไม่ ฉันกำลังใช้ web api 2 ฉันต้องนำเข้าเนมสเปซอะไร
lohiarahul

22

สมมติว่าเรามี API Controller ProductsController: ApiController

มีฟังก์ชั่น Get ซึ่งส่งคืนค่าบางส่วนและคาดว่าจะมีส่วนหัวอินพุตบางส่วน (เช่น 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);
}

ตอนนี้เราสามารถส่งคำขอจากเพจโดยใช้ 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 Core:

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

6

ตามที่ใครบางคนได้ชี้ให้เห็นถึงวิธีการดำเนินการกับ. Net Core หากส่วนหัวของคุณมี "-" หรืออักขระอื่น ๆ . Net ปิดการใช้งานคุณสามารถทำสิ่งต่อไปนี้:

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

5

ลองใช้รหัสเหล่านี้ในกรณีของฉัน:

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

3

สำหรับ WEB API 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 คุณสามารถทำได้เช่นนั้น

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

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.