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.

AndrewRalon
quelle

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

Ramiramilu
quelle
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 ...

Venugopal M.
quelle
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();
    }
}   
Schandlich
quelle
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);
}
SaadK
quelle
6

Falls jemand ASP.NET Core für die Modellbindung verwendet,

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

Es gibt eine integrierte Unterstützung für das Abrufen von Werten aus dem Header mithilfe des Attributs [FromHeader]

public string Test([FromHeader]string Host, [FromHeader]string Content-Type )
{
     return $"Host: {Host} Content-Type: {Content-Type}";
}
Wonster
quelle
3
Content-Typeist keine gültige C #
-Kennung
5

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

IEnumerable<string> values = new List<string>();
this.Request.Headers.TryGetValues("Authorization", out values);
Sufyan Ahmad
quelle
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)
{
}
Scott
quelle
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

Oscar Emilio Perez Martinez
quelle
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"];
Jehof
quelle
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();
      }
Sharif Yazdian
quelle