WebApi에서 헤더 값을 추가하고 가져 오는 방법


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

웹 API 측에서는 새 HttpRequestMessage를 생성하는 대신 Request 객체를 사용하면됩니다.

     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();? 편집 : 원래 Q 스타일과 일치하는 것으로 나타났습니다.
Aidanapword

내 자신의 질문에 대답 : 아니오은 headers.GetValues("somethingNotFound")을 던졌습니다 InvalidOperationException.
Aidanapword

beforeSend헤더를 보내기 위해 JQuery ajax에서 사용 합니까?
Si8

완벽 해 ...를 사용했고 beforeSend효과가있었습니다. Awesome :) +1
Si8

Request 변수의 유형은 무엇이며 컨트롤러 메서드 내에서 액세스 할 수 있습니까? 웹 API 2를 사용하고 있습니다. 가져 오려면 어떤 네임 스페이스가 필요합니까?
lohiarahul jul.

21

API 컨트롤러 ProductsController : ApiController가 있다고 가정합니다.

일부 값을 반환하고 일부 입력 헤더 (예 : UserName & Password)를 예상하는 Get 함수가 있습니다.

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


5

내 경우에는 다음 코드 줄을 사용해보십시오.

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

5

누군가 이미 .Net Core로이 작업을 수행하는 방법을 지적했듯이 헤더에 "-"또는 .Net이 허용하지 않는 다른 문자가 포함 된 경우 다음과 같이 할 수 있습니다.

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

1

WEB API 2.0의 경우 :

나는 Request.Content.Headers대신 사용해야 했다 Request.Headers

그리고 나는 아래와 같이 extestion을 선언했다

  /// <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

현재 OperationContext에서 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();
      }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.