如何为 ASP.NET WebForms 端点允许 CORS?

How to allow CORS for ASP.NET WebForms endpoint?

我正在尝试向 Webforms 样式的 Web 应用程序(.aspx 和 .asmx)添加一些 [WebMethod] 带注释的端点函数。

我想用 [EnableCors] 注释这些端点,从而获得所有好的 ajax-preflight 功能。

VS2013 接受注释,但端点仍然不能很好地与 CORS 配合使用。 (它们在使用 same-origin 但不是 cross-origin 时工作正常)。

我什至无法让它们在又脏又脏的情况下正常工作cross-origin

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");

方法 -- 我的浏览器拒绝响应,cross-origin 响应 headers 不会出现。

如何在这些 [WebMethod] 端点中获得 CORS 功能?

我认为您的代码看起来不错,但 IIS 不会单独发送 header 实体和预期的响应。请检查IIS是否配置正确

如果 CORS 不能解决你的特殊性问题,也许 jsonp 是另一种可能的方式。

我建议仔细检查您是否执行了此页面上的所有步骤:CORS on ASP.NET

除了:

Response.AppendHeader("Access-Control-Allow-Origin", "*");

也试试:

Response.AppendHeader("Access-Control-Allow-Methods","*");

尝试直接在网络配置中添加:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" value="*" />
       <add name="Access-Control-Allow-Headers" value="Content-Type" />
     </customHeaders>
   </httpProtocol>
</system.webServer>

否则,您需要确保您可以控制这两个域。

如果您需要预检请求,例如因此您可以发送经过身份验证的请求,您无法设置 Access-Control-Allow-Origin: *。它必须是特定的 Origin 域。
如果您使用的不是默认值,则还必须设置 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 响应 headers。
(请注意,这些约束正是 CORS 本身的工作方式——这就是它的定义方式。)

因此,仅添加 [EnableCors] 属性是不够的,您必须为参数设置值:

[EnableCors(origins: "https://www.olliejones.com", headers: "X-Custom-Header", methods: "PUT", SupportsCredentials = true)]

或者,如果您想手动明确地执行操作:

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "https://www.olliejones.com");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Custom-Header");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "PUT");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true");

最后一件事 - 您必须在启动时调用 .EnableCors()。例如MVC 或 WebAPI,你会在 HttpConfiguration 上调用它,在注册配置等时 - 但是我不知道它如何与 WebForms 一起工作。

如果使用AppendHeader方法发送cache-specificheaders,同时使用缓存object模型(Cache)设置缓存策略,HTTP响应[=当使用缓存 object 模型时,与缓存有关的 20=] 可能会被删除。此行为使 ASP.NET 能够保持最严格的设置。例如,考虑一个包含用户控件的页面。如果这些控件具有冲突的缓存策略,则将使用最严格的缓存策略。如果一个用户控件设置 header "Cache-Control: Public",而另一个用户控件通过调用 SetCacheability 设置更严格的 header "Cache-Control: Private",则 "Cache-Control: Private" header 将与响应一起发送。

您可以在 web 配置中为 customHeaders 创建一个 httpProtocol。

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" values="*" />        
     </customHeaders>
   <httpProtocol>

你可以在 MVC 中这样做

[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
{
     Response.AppendHeader("Access-Control-Allow-Origin", "*");
     return View();
}

对于网络表单,您可以使用

Response.AddHeader("Access-Control-Allow-Origin", "*");

而不是

Response.AppendHeader("Access-Control-Allow-Origin", "*");

第一个适用于旧版本的 ASP.Net Web 表单。

仅供参考,在经典网络表单中启用 CORS。在Global.asax

void Application_Start(object sender, EventArgs e)
    {        
        GlobalConfiguration.Configuration.EnableCors();        
        RouteTable.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{action}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );