我需要在WebApi中创建一个POST方法,这样我就可以将数据从应用程序发送到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 post方法:
public string Postsam([FromBody]object jsonData)
{
HttpRequestMessage re = new HttpRequestMessage();
var headers = re.Headers;
if (headers.Contains("Custom"))
{
string token = headers.GetValues("Custom").First();
}
}
获取标头值的正确方法是什么?
感谢。
答案 0 :(得分:152)
在Web API方面,只需使用Request对象而不是创建新的HttpRequestMessage
var re = Request;
var headers = re.Headers;
if (headers.Contains("Custom"))
{
string token = headers.GetValues("Custom").First();
}
return null;
输出 -
答案 1 :(得分:16)
假设我们有一个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);
}
});
希望这有助于某人...
答案 2 :(得分:6)
使用TryGetValues方法的另一种方法。
public string Postsam([FromBody]object jsonData)
{
IEnumerable<string> headerValues;
if (Request.Headers.TryGetValues("Custom", out headerValues))
{
string token = headerValues.First();
}
}
答案 3 :(得分:5)
在我的案例中尝试这些代码行:
IEnumerable<string> values = new List<string>();
this.Request.Headers.TryGetValues("Authorization", out values);
答案 4 :(得分:4)
如果有人使用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}";
}
答案 5 :(得分:3)
对于WEB API 2.0:
我必须使用Request.Content.Headers
而不是Request.Headers
然后我宣布了如下的抗议
/// <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");
我希望这会有所帮助
答案 6 :(得分:2)
正如某人已指出如何使用.Net Core进行的操作一样,如果标头中包含“-”或其他一些字符,则.Net不允许,则可以执行以下操作:
public string Test([FromHeader]string host, [FromHeader(Name = "Content-Type")] string contentType)
{
}
答案 7 :(得分:1)
对于.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);
}
答案 8 :(得分:0)
您需要从当前的OperationContext获取HttpRequestMessage。使用OperationContext就可以这样做
OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
HttpRequestMessageProperty requestProperty = messageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
string customHeaderValue = requestProperty.Headers["Custom"];
答案 9 :(得分:0)
对于GET方法中的.net Core,您可以这样做:
StringValues value1;
string DeviceId = string.Empty;
if (Request.Headers.TryGetValue("param1", out value1))
{
DeviceId = value1.FirstOrDefault();
}