Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取rest web api中的请求标头值_Javascript_C#_Asp.net_Ajax_Rest - Fatal编程技术网

Javascript 无法读取rest 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

我使用ajax将令牌存储在请求头中,并将其发送到RESTWebAPI。 这是我发送到web api的请求:

  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没有按预期工作