我正在使用AngularJS运行一个小型Web应用程序,在IIS8.5服务器上运行,并使用DreamFactory进行API。在尝试在服务中发出$ http请求时,我遇到了CORS的问题。
错误一直表明web.config文件中的Access-Control-Allow-Headers值为空;然而,事实并非如此。
尝试发送API请求时收到此错误:"请求标头字段在预检响应中,Access-Control-Allow-Header不允许使用Content-Type。"当在标头请求中取消注释时,我还会在错误中列出X-DreamFactory-API-Key。
我的$ http电话看起来像这样:
$http({ method: 'POST', headers: { 'X-DreamFactory-API-Key':'apiKey' },...
我的web.config文件有:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept, Origin, X-Requested-With, X-DreamFactory-API-Key" />
<add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
这是根级别的配置,已下推到站点级别。
我还在Dreamfactory管理控制台中设置了CORS。
有没有人知道发生了什么以及如何解决这个问题?感谢。
答案 0 :(得分:1)
正如您所知,ASP.NET中的飞行前CORS效果不佳。我没有使用DreamFactory而且我使用的是IIS 7.5,但是,最有可能适用。
我使用自定义HttpModule解决了这个问题。
public class CorsModule : IHttpModule
{
public void Dispose() {
// There's nothing to dispose here, but the dispose implementation is required.
}
public void Init(HttpApplication context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
// Without this .NET sends a weird status code, can't remember what exactly.
context.PreSendRequestHeaders += delegate
{
if (context.Request.HttpMethod == "OPTIONS")
{
var response = context.Response;
response.StatusCode = (int)HttpStatusCode.OK;
}
};
// Bind to the Application_BeginRequest event. This is the important part right here.
context.BeginRequest += this.Application_BeginRequest;
}
private void Application_BeginRequest(Object source, EventArgs e)
{
// Personally I only needed to send those headers in the OPTIONS method.
// You might need to change this for your needs.
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With, SOAPAction");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
我在web.config中唯一需要的是Access-Control-Allow-Origin
,Access-Control-Allow-Credentials
以及对我的HttpModule的引用:
<modules>
<add name="CorsModule" type="MyNamespace.CorsModule, MyAssembly" />
</modules>