Hinzufügen und Abrufen von Header-Werten in WebApi


96

Ich muss eine POST-Methode in WebApi erstellen, damit ich Daten von der Anwendung an die WebApi-Methode senden kann. Ich kann den Header-Wert nicht abrufen.

Hier habe ich Header-Werte in die Anwendung eingefügt:

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

Befolgen Sie die WebApi-Post-Methode:

 public string Postsam([FromBody]object jsonData)
    {
        HttpRequestMessage re = new HttpRequestMessage();
        var headers = re.Headers;

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

Was ist die richtige Methode, um Header-Werte zu erhalten?

Vielen Dank.

Antworten:


184

Verwenden Sie auf der Web-API-Seite einfach das Request-Objekt, anstatt eine neue HttpRequestMessage zu erstellen

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

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

    return null;

Ausgabe -

Geben Sie hier die Bildbeschreibung ein


Kannst du nicht verwenden string token = headers.GetValues("Custom").FirstOrDefault();? Bearbeiten: Ich habe gerade bemerkt, dass Sie dem ursprünglichen Qs-Stil entsprechen.
— Aidanapword

Die Beantwortung meiner eigenen F: Nein , der headers.GetValues("somethingNotFound")eine wirft InvalidOperationException.
— Aidanapword

Verwende ich beforeSendin JQuery Ajax, um den Header zu senden?
— Si8

Perfekt ... ich habe das benutzt beforeSendund es hat funktioniert.
— Genial

Was ist der Typ der Anforderungsvariablen und kann ich innerhalb der Controller-Methode darauf zugreifen? Ich verwende die Web-API 2. Welchen Namespace muss ich importieren?
— Lohiarahul

21

Angenommen, wir haben einen API Controller ProductsController: ApiController

Es gibt eine Get-Funktion, die einen Wert zurückgibt und einen Eingabekopf erwartet (z. B. Benutzername und Passwort).

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

Jetzt können wir die Anfrage von der Seite mit JQuery senden:

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

Hoffe das hilft jemandem ...


9

Eine andere Möglichkeit, die TryGetValues-Methode zu verwenden.

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

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

6

Für .NET Core:

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

Oder

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

Probieren Sie diese Codezeile aus, die in meinem Fall funktioniert:

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

5

Wie bereits erwähnt, können Sie Folgendes tun: Wenn Ihr Header ein "-" oder ein anderes Zeichen enthält, das .Net nicht zulässt, können Sie Folgendes tun:

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

1

Für die WEB API 2.0:

Ich musste Request.Content.Headersstattdessen verwenden Request.Headers

und dann erklärte ich eine Extestion wie unten

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

Und dann habe ich es auf diese Weise aufgerufen.

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

Ich hoffe es könnte hilfreich sein


0

Sie müssen die HttpRequestMessage aus dem aktuellen OperationContext abrufen. Mit OperationContext können Sie es so machen

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

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

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

0

Für die .net Core in GET-Methode können Sie Folgendes tun:

 StringValues value1;
 string DeviceId = string.Empty;

  if (Request.Headers.TryGetValue("param1", out value1))
      {
                DeviceId = value1.FirstOrDefault();
      }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.