2014-01-28 6 views
56

Ich muss eine POST-Methode in WebApi erstellen, damit ich Daten von der Anwendung an die WebApi-Methode senden kann. Ich kann keinen Header-Wert erhalten.Wie man Header-Werte in WebApi hinzufügt und bekommt

Hier habe ich Header-Werte in der Anwendung hinzugefü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); 
     } 

die WebAPI post-Methode Folgende:

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 für Header-Werte zu bekommen?

Danke.

Antwort

110

Auf der Web-API-Seite, einfach Request-Objekt verwenden, anstatt neue HttpRequestMessage

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

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

    return null; 

Ausgang -

enter image description here

+0

Kannst du 'string token = headers.GetValues ​​(" Benutzerdefiniert ") nicht verwenden? FirstOrDefault();'? Edit: Gerade bemerkt, dass Sie ursprünglichen Qs-Stil zusammenpassen. – Aidanapword

+0

Beantworte meine eigene Q: Nein. Die 'headers.GetValues ​​(" somethingNotFound ")' wirft eine 'InvalidOperationException'. – Aidanapword

+0

Benenne ich 'beforeSend' in JQuery ajax, um die Kopfzeile zu senden? – Si8

0

Sie müssen die HttpRequestMessage aus dem aktuellen OperationContext abrufen. Mit Operation Sie es wie so tun können,

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

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

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

andere Art und Weise Verwenden Sie die TryGetValues-Methode.

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

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

Angenommen wir eine API-Controller Products haben: ApiController

Es gibt eine Get-Funktion, die einen Wert zurückgibt und erwartet eine Eingabe-Header (für zB Username & 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 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); 
    } 
}); 

Hope this jemand ...

3

versuchen diese Linie von Codes arbeiten in meinem Fall hilft:

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

+0

Um dies zu einer qualitativ hochwertigen Antwort zu machen, versuchen Sie bitte weiter zu erklären, was Sie tun. Es gibt keine 'actionContext'-Variable in der ursprünglichen Frage und der fragliche Code ist keine 'OnActionExecuting'-Methode. – dbc

+0

Sorry, das war in meinem Fall.Ich korrigiere es. –