为ASP.NET Web窗体ApiController启用Http选项预检请求

时间:2018-07-18 08:42:41

标签: c# asp.net-web-api cors

我有一个带有两个API控制器的ASP.NET Web表单应用程序。 我的一个控制器从另一个域获取请求。由于此请求包含一个Authorization标头,因此浏览器将发送预检请求(HTTP OPTIONS)。 首先,我尝试在Web配置中添加以下内容:

 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
    <add name="Access-Control-Allow-Origin" value="*"/>
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE"/>
    <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type"/>
    <remove name="X-Powered-By"/>
  </customHeaders>
</httpProtocol>

但是它不起作用,并且浏览器因“ 405-不允许使用方法”错误而失败。 仅在将以下代码添加到global.asax时,我才成功收到预检请求

    protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        //These headers are handling the "pre-flight" OPTIONS call sent by the browser
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow‌-Credentials", "true");
        HttpContext.Current.Response.End();
    }
}

困扰我的是,此代码为所有Web API控制器启用了预检请求,而我只想为我的一个控制器启用它。 我知道我可以使用带有[HttpOptions]批注的函数来解决它,但是我不想为控制器中的每个函数添加它。有没有办法为所有控制器功能启用它?

1 个答案:

答案 0 :(得分:1)

将此方法添加到Global.asax.cs并放置此代码

using System.Web;

namespace Example
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }
    }
}

Nice Blog For you