WebApiでヘッダー値を追加および取得する方法


98

アプリケーションからWebApiメソッドにデータを送信できるように、WebApiでPOSTメソッドを作成する必要があります。ヘッダー値を取得できません。

ここで、アプリケーションにヘッダー値を追加しました。

 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 postメソッドに従う:

 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

Web 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();か?編集:元のQsスタイルと一致していることに気づきました。
Aidanapword 2016年

私自身のQに答える:いいえがheaders.GetValues("somethingNotFound")スローされますInvalidOperationException
Aidanapword 2016年

beforeSendヘッダーを送信するためにJQuery ajaxで使用しますか?
Si8、2017年

パーフェクト...私はを使用しましたがbeforeSend、うまくいきました。素晴らしい:) +1
Si8

リクエスト変数のタイプは何ですか?コントローラメソッド内でそれにアクセスできますか?Web API 2を使用しています。どの名前空間をインポートする必要がありますか?
lohiarahul 2017

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

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

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

そして、私は以下のように抗議を宣言しました

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