Мне нужно создать метод POST в WebApi, чтобы я мог отправлять данные из приложения в метод WebApi. Я не могу получить значение заголовка.
Здесь я добавил в приложение значения заголовка:
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);
}
Следуя методу публикации 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();
}
}
Каков правильный метод получения значений заголовков?
Спасибо.
c#
asp.net-mvc
asp.net-mvc-4
c#-4.0
asp.net-web-api
Эндрю Ралон
источник
источник
string token = headers.GetValues("Custom").FirstOrDefault();
? Изменить: только что заметил, что вы соответствуете оригинальному стилю Qs.headers.GetValues("somethingNotFound")
БросаетInvalidOperationException
.beforeSend
в JQuery ajax для отправки заголовка?beforeSend
и это сработало. Потрясающе :) +1Предположим, у нас есть API-контроллер ProductsController: ApiController
Существует функция Get, которая возвращает некоторое значение и ожидает некоторый входной заголовок (например, UserName & Password).
[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); }
Теперь мы можем отправить запрос со страницы с помощью JQuery:
$.ajax({ url: 'api/products/10', type: 'GET', headers: { 'username': 'test','password':'123' }, success: function (data) { alert(data); }, failure: function (result) { alert('Error: ' + result); } });
Надеюсь, это кому-то поможет ...
источник
Другой способ использования метода TryGetValues.
public string Postsam([FromBody]object jsonData) { IEnumerable<string> headerValues; if (Request.Headers.TryGetValues("Custom", out headerValues)) { string token = headerValues.First(); } }
источник
Для .NET Core:
string Token = Request.Headers["Custom"];
Или
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); }
источник
Если кто-то использует ASP.NET Core для привязки модели,
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
Встроена поддержка извлечения значений из заголовка с помощью атрибута [FromHeader].
public string Test([FromHeader]string Host, [FromHeader]string Content-Type ) { return $"Host: {Host} Content-Type: {Content-Type}"; }
источник
Content-Type
не является допустимым идентификатором C #Как кто-то уже указывал, как это сделать с .Net Core, если ваш заголовок содержит «-» или какой-либо другой символ, запрещенный .Net, вы можете сделать что-то вроде:
public string Test([FromHeader]string host, [FromHeader(Name = "Content-Type")] string contentType) { }
источник
попробуйте эту строку кодов, работающих в моем случае:
IEnumerable<string> values = new List<string>(); this.Request.Headers.TryGetValues("Authorization", out values);
источник
Для WEB API 2.0:
Мне пришлось использовать
Request.Content.Headers
вместоRequest.Headers
а затем я объявил extestion, как показано ниже
/// <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(); }
И затем я вызвал его таким образом.
var headerValue = Request.Content.Headers.GetHeader("custom-header-key", "default-value");
Я надеюсь это может быть полезно
источник
Вам нужно получить HttpRequestMessage из текущего OperationContext. Используя OperationContext, вы можете сделать это так
OperationContext context = OperationContext.Current; MessageProperties messageProperties = context.IncomingMessageProperties; HttpRequestMessageProperty requestProperty = messageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; string customHeaderValue = requestProperty.Headers["Custom"];
источник
Для .net Core в методе GET вы можете сделать следующее:
StringValues value1; string DeviceId = string.Empty; if (Request.Headers.TryGetValue("param1", out value1)) { DeviceId = value1.FirstOrDefault(); }
источник