Cách thêm và lấy giá trị Header trong WebApi


98

Tôi cần tạo phương thức POST trong WebApi để có thể gửi dữ liệu từ ứng dụng đến phương thức WebApi. Tôi không thể nhận giá trị tiêu đề.

Ở đây tôi đã thêm các giá trị tiêu đề trong ứng dụng:

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

Theo phương pháp đăng 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();
        }
    }

Phương pháp chính xác để nhận giá trị tiêu đề là gì?

Cảm ơn.

Câu trả lời:


186

Về phía API Web, chỉ cần sử dụng đối tượng Yêu cầu thay vì tạo HttpRequestMessage mới

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

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

    return null;

Đầu ra -

nhập mô tả hình ảnh ở đây


Bạn có thể không sử dụng string token = headers.GetValues("Custom").FirstOrDefault();? Chỉnh sửa: Chỉ nhận thấy rằng bạn đã phù hợp với kiểu Qs ban đầu.
Aidanapword

Trả lời của riêng tôi Q: Không. headers.GetValues("somethingNotFound")Ném an InvalidOperationException.
Aidanapword vào

Tôi có sử dụng beforeSendajax trong JQuery để gửi tiêu đề không?
Si8

Hoàn hảo ... Tôi đã sử dụng beforeSendvà nó hoạt động. Tuyệt vời :) +1
Si8

Loại biến Yêu cầu là gì và tôi có thể truy cập nó bên trong phương thức controller không? Tôi đang sử dụng web api 2. Tôi cần nhập không gian tên nào?
lohiarahul

21

Giả sử chúng ta có Bộ điều khiển API ProductsController: ApiController

Có một hàm Get trả về một số giá trị và mong đợi một số tiêu đề đầu vào (ví dụ: 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);
}

Bây giờ chúng ta có thể gửi yêu cầu từ trang bằng JQuery:

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

Hy vọng điều này sẽ giúp ai đó ...


9

Một cách khác bằng cách sử dụng phương thức TryGetValues.

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

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

6

Đối với .NET Core:

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

Hoặc là

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

Trong trường hợp ai đó đang sử dụng ASP.NET Core để liên kết mô hình,

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

Có sẵn hỗ trợ để truy xuất các giá trị từ tiêu đề bằng cách sử dụng thuộc tính [FromHeader]

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

3
Content-Typekhông phải là một C # định danh hợp lệ
thepirat000

5

hãy thử những dòng mã này hoạt động trong trường hợp của tôi:

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

5

Như ai đó đã chỉ ra cách thực hiện điều này với .Net Core, nếu tiêu đề của bạn chứa "-" hoặc một số ký tự khác .Net không cho phép, bạn có thể làm như sau:

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

1

Đối với WEB API 2.0:

Tôi đã phải sử dụng Request.Content.Headersthay vì Request.Headers

và sau đó tôi đã khai báo một phần mở rộng như bên dưới

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

Và sau đó tôi gọi nó bằng cách này.

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

Tôi hy vọng nó có thể hữu ích


0

Bạn cần lấy HttpRequestMessage từ OperationContext hiện tại. Sử dụng OperationContext bạn có thể làm như vậy

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

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

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

0

Đối với .net Core trong phương thức GET, bạn có thể làm như sau:

 StringValues value1;
 string DeviceId = string.Empty;

  if (Request.Headers.TryGetValue("param1", out value1))
      {
                DeviceId = value1.FirstOrDefault();
      }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.