Javascript 无法读取rest web api中的请求标头值
我使用ajax将令牌存储在请求头中,并将其发送到RESTWebAPI。 这是我发送到web api的请求:Javascript 无法读取rest web api中的请求标头值,javascript,c#,asp.net,ajax,rest,Javascript,C#,Asp.net,Ajax,Rest,我使用ajax将令牌存储在请求头中,并将其发送到RESTWebAPI。 这是我发送到web api的请求: var xhr = new XMLHttpRequest(); $.ajax({ url: 'http://localhost:32253/api/UserDetail/Authenticate', headers: { "Authorization-Toke
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
headers: {
"Authorization-Token": res,
"X-HTTP-Method-Override": "GET"
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
在服务器端(RESTWebAPI),我试图读取头
if (Request.Headers.Contains("Authorization-Token"))
{
var token = Request.Headers.GetValues("Authorization-Token").First();
}
但请求不包含标题“授权令牌”。我可以在访问控制请求标头中看到标头名称。我不知道如何解读它的价值。有人能帮帮我吗。我也启用了cors
更新
现在,我使用请求对象的标准授权头传递令牌
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + res);
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
authorization: res,
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
但我在请求头中找不到它。
有关更多详细信息,请参见图片
请求日志
这是在服务器端收到的请求
OPTIONS /api/UserDetail/Authenticate HTTP/1.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en;q=0.5
Host: localhost:32253
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization-token,content-type
Origin: http://localhost:14576
尝试使用标准标题名称。可能在所有网络跃点中都没有传递该值。将授权标头与承载方案一起使用,因为这是标准的,然后在C#中,它也是标准属性
"Authorization" : "Bearer sometoken"
var header = this.Request.Headers.Authorization;
if(header != null && header.Scheme == "Bearer") { /* do something with header.Value */ }
如果必须使用非标准标题,请在其前面加上X,例如:
"X-Authorization-Token" : "sometoken"
任何代理或路由器都应该让X-Header顺利通过
更新
尝试使用beforeSend选项设置标题:
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization-Token', res);
},
请尝试以下操作:
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization-Token', res);
xhr.setRequestHeader('X-HTTP-Method-Override', "GET");
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
更新:
捕获网络并能够在请求头中找到令牌。有关更多详细信息,请参见图片
没有完整的代码就不能说任何东西。谢谢丹尼尔的建议。问题正如您在选项请求中所说的那样。我在OPTIONS请求的响应中设置了Access Control Allow标头。我在RESTWebAPI的global.asax.cs中添加了以下内容
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:14576");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Authorization-Token, X-HTTP-Method-Override");
HttpContext.Current.Response.End();
}
}
客户端请求代码如下所示:
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Authorization-Token', res);
xhr.setRequestHeader('X-HTTP-Method-Override', "GET");
},
type: 'GET',
async: false,
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
},
error: function (xhr, status) {
alert(status);
}
});
读取标头的Rest web api代码:
if (Request.Headers.Contains("X-Authorization-Token"))
{
var token = Request.Headers.GetValues("X-Authorization-Token").First();
}
这个很好用
谢谢你们的时间和建议:)我两个都试过了,但都不管用。对于Request.Headers.Authorization,授权值为null。在前缀的情况下,我可以在访问控制请求标头中看到标头名称,但request.Headers会引发异常“未找到给定标头”在localhost下运行时是否有效?也许我们可以把它隔离到CORS问题上。我注意到你也在使用X-HTTP-Method-Override头。仔细检查处理程序代码,确保它没有剥离任何标题。你可以在Application_BeginRequest方法中设置一个断点,看看头是否在请求的开始处,如果它在那里,但不在你的控制器上,那么你就有东西截获它。我只是再次查看了你的js代码,注意到它已经指向localhost,所以CORS不是问题所在。如果您使用js应用程序作为api访问同一个域,那么您可以一起删除COR。我使用c#code在请求头中传递Auth令牌,并向rest web api发出请求,web api中接收到的请求包含头,而如果我使用ajax传递令牌,它会抛出异常“header not found”.我已经用web API代码尝试过了…它可以工作了。。string token=Request.Headers.FirstOrDefault(x=>x.Key.ToLower()==“授权令牌”).Value.FirstOrDefault();我正在获取令牌的价值我已将请求的图像添加到web api中。。你能调查一下吗?我找不到标题我很高兴你找到了!有一个nuget包可以帮助实现这一点:然后在您的WebApiConfig中,您只需添加这个
config.EnableCors(新的EnableCorsAttribute(“domain.com”,“*”,“*”))代码>微软有一篇很好的文章。我第一次尝试使用CORS,但没有任何帮助。。我在webapiconfig中启用了CORS,并在get方法中添加了enablecors。但是这没有帮助。。最后,我卸载了CORS并尝试了上述解决方案,它最终成功了。。我不知道为什么CORS没有按预期工作