【问题标题】:ASP MVC 3 - Jquery Ajax always sending Options not PostASP MVC 3 - Jquery Ajax 总是发送选项而不是发布
【发布时间】:2011-09-18 05:12:38
【问题描述】:

我有一个简单的 javascript ajax 请求:

$("#login-submit").button().click(function() {
                var ajaxOptions = {
                    url: "http://localhost:29097/authentication/",
                    type: "POST",
                    data: $("login-form").serialize(),
                    success: function(result) { $("body").html(result); }
                };
                $.ajax(ajaxOptions);
            });

但是,每当我发送请求时,它总是发送一个 OPTIONS 请求,而不是指定的 POST 请求。在阅读了更多之后,它似乎可能归结为跨站点发布。我在我的 MVC 应用程序中添加了一个自定义操作过滤器,它检查 OPTION 请求并使用指定“GET、POST、PUT、DELETE”的“允许”标头进行响应,尽管它似乎从未执行过后续 POST 请求...我是这里遗漏了什么?

请求(在 Firefox、Chrome 中尝试过):

OPTIONS http://localhost:29097/authentication/ HTTP/1.1
Host: localhost:29097
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with

回应:

HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Sun, 19 Jun 2011 16:20:41 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Allow: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: *
Access-Control-Allow-Origin: *
Cache-Control: private
Content-Length: 0
Connection: Close

我自己通过 MVC 发回 401 请求,因为它似乎是用来指示用户凭据无效的最佳标头。这个状态码会不会导致任何问题?

【问题讨论】:

  • 如果您用 200 而不是 401 响应,它会做什么?在我看来,错误响应不太可能起作用。
  • @Pointy - 同样的事情,它只是返回并且没有发出后续请求。当我制作一个简单的 ASPMVC RESTful Web 服务时,这个问题就开始了,每当我用 Jquery Ajax 调用它时,参数都不是自动绑定的,并且始终为空。这导致我注意到标头没有包含任何帖子信息,因为它是一个 OPTIONS 请求,并且由于它没有在收到响应后用 POST 跟进 OPTIONS,所以我对我还能做什么有点迷茫...我相信这一定是可行的...

标签: jquery ajax http asp.net-mvc-3 rest


【解决方案1】:

您正在使用实现Cross Origin Resource Sharing 的浏览器。为了支持这一点,您的服务器需要使用 Access-Control-Allow-Origin 标头响应 OPTIONS 请求。

【讨论】:

  • 我在上面发布的回复中不包含这些内容吗?我也尝试过包括 Access-Control-Allow-Methods,但这没有用,在其他地方我看到一个帖子说只是尝试“允许”,尝试了两者......仍然没有运气
  • @somemvcperson 你说得对。我链接到的规范应该提供您在这种特定情况下需要哪些标头所需的所有指导。
  • 我已经尝试了所有合适的标头,但没有这样的运气:(我一直在做更多的研究,显然你不能对另一个域做客户端 xmlHttpRequest:jquery-tutorial.net/ajax/same-origin-policy 我觉得真的很难如果你真的知道你在做什么,相信你不能将你的服务器设置为接受 XSS……如果你只能从你自己的域中使用它,那么 Web 服务有什么用?我能看到的唯一替代方案是 JSONP,服务器代理,Flash Proxy...所有这些似乎都破坏了拥有干净网络服务的原因...
  • @somemvcperson 你看到关于这个问题的建议了吗? stackoverflow.com/questions/4452519/…
  • 给出这个答案,因为 CORS 绝对是这类东西的正确方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2023-04-04
  • 2012-03-09
  • 1970-01-01
相关资源
最近更新 更多