CORS自定义标题

时间:2015-12-31 18:07:17

标签: angularjs cors

我正在使用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。

有没有人知道发生了什么以及如何解决这个问题?感谢。

1 个答案:

答案 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-OriginAccess-Control-Allow-Credentials以及对我的HttpModule的引用:

<modules>
    <add name="CorsModule" type="MyNamespace.CorsModule, MyAssembly" />
</modules>