ajax POST调用不同域上的Web API

时间:2012-12-20 13:50:05

标签: javascript asp.net ajax xmlhttprequest cross-domain

我已经阅读了许多关于“不同域名上的POST请求”问题的“解决方案”,也称为“跨域帖子”,但我仍然不能让它像他们说的那样修复它。 / p>

从阅读有关此问题的所有文章,我现在知道为什么会发生这种情况,但我仍然需要它以我的项目工作,以安全的方式工作,而不使用黑客移动或此类事情。 我想如果有人知道如何让它起作用,帮助我们,我的意思是'我们'因为我相信仍然有人没有成功。

我的情况: 我有一个托管在domainA上的webapp,它调用了对domainB(mvc4 webAPI)的ajax调用。 ajax post call看起来像这样:

var profile = { Id:"1234567890", Name:"Name_01"}
$.ajax({
  type: "POST",
  url: 'http://domainB/api/Profile',
  data: JSON.stringify(profile)
});

@domainB我以前用来设置自定义响应标头:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*"/>
        <add name="Access-Control-Allow-Headers" value="X-Requested-With" />
        <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS"/>
      </customHeaders>
    </httpProtocol>
</system.webServer>

@domainB webAPI post方法我有这个:

public void Post(dynamic newProfile)
{
...
}

所以在激活/启动ajax调用时,在webAPI项目的调试模式下,我在webAPI中的JsonFX.Serilization.DataWriter获取SerializationException Operation could destabilize the runtime,并且在浏览器中出错

XMLHttpRequest cannot load http://domainA/api/Profile. Origin http://domainB is not allowed by Access-Control-Allow-Origin.

我正在捕捉请求并回复Fiddler,我发现响应方面根本没有Access-Control-Allow标题。

我写了我正在使用的内容,现在因为没有解决这个问题我应该做些什么才能让ajax post调用从domainA到domainB,或者是什么才是真正的解决方案。

2 个答案:

答案 0 :(得分:2)

不是尝试依赖各种可用的脚本/解决方法来执行跨域调用,而是为什么不在您自己的域上创建Web方法。

你可以用你的AJAX调用它。

然后让您自己的网络方法执行对其他域的调用 - 这不会遇到与浏览器执行调用相同的安全问题。

所以你的电话会是这样的:

浏览器AJAX通话 - &gt;您自己的网络方法 - &gt;致电其他域名服务 - &gt;结果返回到您的方法 - &gt;您的方法将返回浏览器。

答案 1 :(得分:0)

听起来它可能是CORS预检请求的问题。请尝试在http://www.html5rocks.com/en/tutorials/cors/http://remysharp.com/2011/04/21/getting-cors-working/http://www.w3.org/TR/cors/

中阅读相关内容

无论如何......如果是非简单的AJAX请求,浏览器首先会向您的URL发出OPTIONS请求,您需要处理该请求并返回预期的结果。如果浏览器的OPTIONS响应正常,则它会首先发送您希望它发送的实际POST请求。因此,如果您只有POST的处理程序而不是OPTIONS(在您的服务器上),那么您可能无法正确处理预检请求(OPTIONS)并且一切都崩溃了。