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.