【问题标题】:ajax POST call to webAPI on different domainajax POST 调用不同域上的 webAPI
【发布时间】:2012-12-08 01:25:36
【问题描述】:

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

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

我的情况: 我有托管在 domainA 上的 webapp,它使 ajax 后调用 domainB(mvc4 webAPI)。 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 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 发布调用从 domainA 工作到 domainB,或者什么是真正的解决方案。

【问题讨论】:

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


【解决方案1】:

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

您可以使用 AJAX 调用它。

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

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

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

【讨论】:

  • 问题是,我只使用客户端编码。这就是我问这个的原因。无论如何,请等待您的时间和回答。
  • 啊,不好意思。根据我的经验,这些跨域解决方法中的许多都是不可靠的。尤其是考虑到不同的浏览器可能会很痛苦。
【解决方案2】:

听起来这可能是 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),一切都会崩溃。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2014-01-21
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2011-08-21
    • 2014-04-01
    相关资源
    最近更新 更多