Muszę utworzyć metodę POST w WebApi, aby móc wysyłać dane z aplikacji do metody WebApi. Nie mogę uzyskać wartości nagłówka.
Tutaj dodałem wartości nagłówka w aplikacji:
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);
}
Zgodnie z metodą publikowania WebApi:
public string Postsam([FromBody]object jsonData)
{
HttpRequestMessage re = new HttpRequestMessage();
var headers = re.Headers;
if (headers.Contains("Custom"))
{
string token = headers.GetValues("Custom").First();
}
}
Jaka jest poprawna metoda uzyskiwania wartości nagłówka?
Dzięki.
c#
asp.net-mvc
asp.net-mvc-4
c#-4.0
asp.net-web-api
AndrewRalon
źródło
źródło
string token = headers.GetValues("Custom").FirstOrDefault();
? Edycja: właśnie zauważyłem, że pasujesz do oryginalnego stylu Qs.headers.GetValues("somethingNotFound")
RzutyInvalidOperationException
.beforeSend
w JQuery Ajax do wysyłania nagłówka?beforeSend
i zadziałało. Niesamowite :) +1Załóżmy, że mamy kontroler API ProductsController: ApiController
Istnieje funkcja Get, która zwraca pewną wartość i oczekuje nagłówka wejściowego (np. Nazwa użytkownika i hasło)
[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); }
Teraz możemy wysłać żądanie ze strony za pomocą JQuery:
$.ajax({ url: 'api/products/10', type: 'GET', headers: { 'username': 'test','password':'123' }, success: function (data) { alert(data); }, failure: function (result) { alert('Error: ' + result); } });
Mam nadzieję, że to komuś pomoże ...
źródło
Inny sposób przy użyciu metody TryGetValues.
public string Postsam([FromBody]object jsonData) { IEnumerable<string> headerValues; if (Request.Headers.TryGetValues("Custom", out headerValues)) { string token = headerValues.First(); } }
źródło
W przypadku platformy .NET Core:
string Token = Request.Headers["Custom"];
Lub
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); }
źródło
W przypadku, gdy ktoś używa ASP.NET Core do wiązania modelu,
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
Istnieje wbudowana obsługa pobierania wartości z nagłówka przy użyciu atrybutu [FromHeader]
public string Test([FromHeader]string Host, [FromHeader]string Content-Type ) { return $"Host: {Host} Content-Type: {Content-Type}"; }
źródło
Content-Type
nie jest prawidłowym identyfikatorem C #wypróbuj te linie kodów działające w moim przypadku:
IEnumerable<string> values = new List<string>(); this.Request.Headers.TryGetValues("Authorization", out values);
źródło
Jak ktoś już wskazał, jak to zrobić z .Net Core, jeśli twój nagłówek zawiera „-” lub jakiś inny znak, którego .Net zabrania, możesz zrobić coś takiego:
public string Test([FromHeader]string host, [FromHeader(Name = "Content-Type")] string contentType) { }
źródło
W przypadku WEB API 2.0:
Musiałem użyć
Request.Content.Headers
zamiastRequest.Headers
a potem ogłosiłem wymuszenie, jak poniżej
/// <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(); }
A potem wywołałem to w ten sposób.
var headerValue = Request.Content.Headers.GetHeader("custom-header-key", "default-value");
Mam nadzieję, że to może być pomocne
źródło
Musisz pobrać HttpRequestMessage z bieżącego OperationContext. Używając OperationContext możesz to zrobić w ten sposób
OperationContext context = OperationContext.Current; MessageProperties messageProperties = context.IncomingMessageProperties; HttpRequestMessageProperty requestProperty = messageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; string customHeaderValue = requestProperty.Headers["Custom"];
źródło
Dla .net Core w metodzie GET możesz zrobić tak:
StringValues value1; string DeviceId = string.Empty; if (Request.Headers.TryGetValue("param1", out value1)) { DeviceId = value1.FirstOrDefault(); }
źródło