【发布时间】:2016-11-14 19:16:08
【问题描述】:
我的服务器端是一个C# mvc 项目。
我们尝试实现对客户端的响应。
我使用node-js 和npm,使用express 服务器和hot-reloading,所以当我编译我的客户端代码时,它在http://localhost:3000 上运行。
现在我想添加一些服务器端调用。
为此,我使用 iis express 运行我的c# 代码,该代码也在另一个端口的 localhost 上打开。
现在的问题是,当端口:3000 上的客户端代码对也在 localhost 上的 iis express 进行 ajax 调用时,我收到 "Response for preflight is invalid (redirect)" 错误,这是因为相同的域策略。
那么我做错了什么,当您的服务器和客户端分开时,您打算如何在开发模式下工作?
我试图添加到我的 ASP.NET
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
编辑 - 解决方案
当您将帖子发送到不同的域时,首先客户端发送OPTIONS 请求。所以解决方法其实就是添加这段代码:
protected void Application_BeginRequest(object sender, EventArgs e)
{
EnableCrossOriginRequestsFromLocalhost(HttpContext.Current.Request);
}
private void EnableCrossOriginRequestsFromLocalhost(HttpRequest request)
{
if (!HttpContext.Current.Request.IsLocal) return;
if (request.UrlReferrer == null) return; //can't set Access-Control-Allow-Origin header reliably without a referrer so just return. Referrer should always be set when being called from an app under development because the app under development's URL will be sent as the referrer automatically.
var response = HttpContext.Current.Response;
response.AddHeader("Access-Control-Allow-Origin", request.UrlReferrer.GetLeftPart(UriPartial.Authority));
response.AddHeader("Access-Control-Allow-Credentials", "true");
if (request.HttpMethod == "OPTIONS")
{
response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
response.AddHeader("Access-Control-Max-Age", "1728000");
response.End();
}
}
【问题讨论】:
-
你应该在你的 IIS express 上允许 CORS。
preflight是 HTTP OPTIONS 请求,其中服务器应以Allow-Control-*标头响应。下面是对 CORS 的精彩介绍:html5rocks.com/en/tutorials/cors -
@zeronone 我试过了,看看我的编辑,它不起作用,它适用于获取请求,但不适用于 post
-
显然我以前看过这个帖子,但同样,它没有解决它
-
您是否通过 POST 请求提交表单?尝试将 Content-Type 设置为
application/x-www-form-urlencoded