Hoofdwaarden toevoegen en ophalen in WebApi

Ik moet een POST-methode maken in WebApi, zodat ik gegevens van de toepassing naar de WebApi-methode kan verzenden. Ik kan de headerwaarde niet ophalen.

Hier heb ik header-waarden toegevoegd in de applicatie:

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

Volgens de WebApi-postmethode:

public string Postsam([FromBody]object jsonData)
    {
        HttpRequestMessage re = new HttpRequestMessage();
        var headers = re.Headers;
        if (headers.Contains("Custom"))
        {
            string token = headers.GetValues("Custom").First();
        }
    }

Wat is de juiste methode om koptekstwaarden op te halen?

Bedankt.


Antwoord 1, autoriteit 100%

Gebruik aan de kant van de Web-API gewoon het Request-object in plaats van een nieuw HttpRequestMessage te maken

    var re = Request;
    var headers = re.Headers;
    if (headers.Contains("Custom"))
    {
        string token = headers.GetValues("Custom").First();
    }
    return null;

Uitvoer –

voer hier de afbeeldingsbeschrijving in


Antwoord 2, autoriteit 11%

Stel dat we een API-controller hebben
ProductenController: ApiController

Er is een Get-functie die een waarde retourneert en een invoerkop verwacht (voor bijvoorbeeld gebruikersnaam en wachtwoord)

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

Nu kunnen we het verzoek vanaf de pagina verzenden met JQuery:

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

Ik hoop dat dit iemand helpt …


Antwoord 3, autoriteit 7%

Zoals iemand al heeft aangegeven hoe je dit kunt doen met .Net Core, als je header een “-” bevat of een ander teken dat .Net niet toestaat, kun je zoiets doen als:

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

Antwoord 4, autoriteit 6%

Een andere manier met behulp van de TryGetValues-methode.

public string Postsam([FromBody]object jsonData)
{
    IEnumerable<string> headerValues;
    if (Request.Headers.TryGetValues("Custom", out headerValues))
    {
        string token = headerValues.First();
    }
}   

Antwoord 5, autoriteit 4%

Voor .NET Core:

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

Of

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

Antwoord 6, autoriteit 4%

Als iemand ASP.NET Core gebruikt voor modelbinding,

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

Er is ingebouwde ondersteuning voor het ophalen van waarden uit de header met behulp van het [FromHeader] attribuut

public string Test([FromHeader]string Host, [FromHeader]string Content-Type )
{
     return $"Host: {Host} Content-Type: {Content-Type}";
}

Antwoord 7, autoriteit 2%

probeer deze regel codes die in mijn geval werken:

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

Antwoord 8

Voor WEB API 2.0:

Ik moest Request.Content.Headersgebruiken in plaats van Request.Headers

en toen verklaarde ik een extestie zoals hieronder

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

En toen riep ik het op deze manier aan.

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

Ik hoop dat het nuttig kan zijn


Antwoord 9

U moet de HttpRequestMessage ophalen uit de huidige OperationContext. Met OperationContext kun je het zo doen

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
HttpRequestMessageProperty requestProperty = messageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
string customHeaderValue = requestProperty.Headers["Custom"];

Antwoord 10

Voor .net Core in de GET-methode kunt u dit als volgt doen:

StringValues value1;
 string DeviceId = string.Empty;
  if (Request.Headers.TryGetValue("param1", out value1))
      {
                DeviceId = value1.FirstOrDefault();
      }

Antwoord 11

app.MapGet("/", ([FromHeader(Name = "User-Agent")] string data) =>
{
    return $"User agent header is: {data}";
});

Antwoord 12

Een eenvoudige functie om een ​​headerwaarde te krijgen, met een “one-liner”-variant met TryGetValue:

private string GetHeaderValue(string key) =>
    Request.Headers.TryGetValue(key, out var value)
        ? value.First()
        : null;
var headerValue = GetHeaderValue("Custom");

Other episodes