3

我已经阅读了许多关于“在不同域上发布请求”问题的“解决方案”,也称为“跨域发布”,但我仍然无法像他们说他们修复它那样工作。

通过阅读所有关于这个问题的文章,我现在知道为什么会这样,但我仍然需要它以安全的方式在我的项目中工作,而不使用黑客动作或类似的东西。我想如果有人知道如何使它起作用,来帮助我们,我的意思是“我们”,因为我相信仍然有些人没有弥补。

我的情况:我有一个托管在 domainA 上的 webapp,它对 domainB(mvc4 webAPI)进行 ajax post 调用。ajax post 调用如下所示:

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 发布方法我有这个:

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

因此,在激活/启动 ajax 调用时,在 webAPI 项目的调试模式下,我Operation could destabilize the runtime在 webAPI 中的 JsonFX.Serilization.DataWriter 处收到 SerializationException,并且在浏览器中出现错误,我得到

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,或者什么是真正的解决方案。

4

2 回答 2

2

与其尝试依赖各种可用的脚本/解决方法来执行跨域调用,不如在您自己的域上创建一个 Web 方法。

你可以用你的 AJAX 调用它。

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

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

浏览器 AJAX 调用 --> 您自己的 web 方法 --> 调用其他域服务 --> 结果返回给您的方法 --> 您的方法返回给您的浏览器。

于 2012-12-20T14:22:47.117 回答
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)并且一切都崩溃了。

于 2012-12-20T17:47:22.287 回答