ajax POST调用不同域的webAPI

ajax POST call to webAPI on different domain

本文关键字:webAPI POST 调用 ajax      更新时间:2023-09-26

我已经阅读了许多关于"不同域的POST请求"问题的"解决方案",也被称为"跨域POST",但我仍然不能像他们说的那样解决这个问题。

通过阅读所有关于这个问题的文章,我现在知道为什么会发生这种情况,但我仍然需要它在我的项目中以安全的方式工作,而不使用黑客移动或诸如此类的东西。我想如果有人知道如何让它工作,帮助我们,我的意思是"我们",因为我相信还有人没有编出来。

我的情况:我有托管在domainA上的webapp,这使得ajax post call 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.

我正在捕捉提琴手的请求和响应,我看到在响应端根本没有Access-Control-Allow标头。

我写了我正在使用的东西,现在因为这不是我应该怎么做才能使ajax post call从domainA工作到domainB,或者什么是真正的解决方案。

与其尝试依赖各种可用的脚本/变通方法来执行跨域调用,不如在自己的域中创建一个web方法。

可以用AJAX调用它。

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

所以你的调用会像这样:

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

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