针对你的第一个问题,
我该怎么做才能进行跨域请求?
首先向服务器发送以下请求头。当响应头不匹配时,即使有返回结果,UserAgent(浏览器)也会丢弃它并不将其回传给XHR回调。
Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header
然后,你的服务器应当响应以下头:
Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header
示例来源于 - https://dev59.com/Nmoy5IYBdhLWcg3wPLr0#8689332
你可以使用 Fiddler, Web Inspector 网络标签(Chrome)或 Firebug 的网络标签来查找服务器响应请求时发送的头信息。
第三方API服务器URL应该返回支持的值,如果没有,则这是你的问题。
JsonP 500服务器错误无法提供太多帮助,因为它表示内部服务器错误。
更新
我看到了你的截图,以下几点需要注意:
- 使用了
HTTP POST
- 两种模式的响应中均未发现
Access-Control
头。第二个状态码为302
Origin
请求头为 null
,因此我认为 HTML 文件是从文件系统而不是从网站打开的。
启用JSONP
为什么JSONP不起作用呢?原因是在指定的ASMX的Web服务配置中,请求没有启用GET
模式。JSONP不能使用POST
。
为什么禁用安全性后会返回200
?
直接调用POST请求,没有触发OPTIONS
或预检请求,所以服务器直接响应回来。
为什么启用安全性后会返回302
状态码?
首先讲一下当未禁用安全标志时的情况。向URL发送一个OPTIONS
请求,URL应该响应一个可以使用的HTTP方法列表,例如GET
、POST
等等。这个OPTIONS
请求的状态码应该是200
。
在当前情况下,进行此操作时会发生重定向。这个重定向指向了一个自定义的HTTP服务器错误处理程序。我认为它是404
错误,并被捕获并重定向。(可能是因为自定义处理程序设置为ResponseRedirect
而不是ResponseRewrite
)。404
的原因是跨域访问未启用。
如果关闭自定义错误处理,则会返回HTTP 500
代码。我认为可以通过在跨域请求后立即检查服务器日志来找到问题所在。如果有其他错误,请检查服务器日志。
可能的解决方案
为了启用访问,有两种方法- 详见此处。或者直接将访问控制标头添加到web.config
文件的customheaders
部分。
当启用跨域访问时,服务器应该响应 OPTIONS,并允许请求通过。这应该返回 HTTP 200,除非有其他错误。但是 AJAX 回调将无法访问响应。只能在设置 Access-Control-Allow-Origin 为 "*" 或 Origin 请求头值以及必要的 Access-Control 的情况下进行。然后 AJAX 回调将按预期接收响应。
第三点是 null Origin。如果 Origin 请求头值作为 Access-Control-Allow-Origin 返回,这将是一个问题。但我假设您将把 HTML 页面移动到 Web 服务器上,因此不应该是个问题。
希望这可以帮助!