如何允许 CORS 用于 WebForms 终结点 ASP.NET
本文关键字:结点 ASP NET WebForms 何允许 CORS 用于 | 更新日期: 2023-09-27 18:36:20
我正在尝试将一些[WebMethod]
注释的端点函数添加到Webforms风格的Web应用程序(.aspx和.asmx)。
我想用[EnableCors]
注释这些端点,从而获得所有良好的 ajax 预检功能。
VS2013 接受注释,但端点仍然不能很好地与 CORS 配合使用。(当使用同源但不能跨源时,它们工作正常)。
我什至无法让它们与羽绒和肮脏的跨源运行
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");
方法 -- 我的浏览器拒绝响应,并且不显示跨源响应标头。
如何在这些[WebMethod]
终结点中获取 CORS 功能?
我建议仔细检查您是否已执行此页面上的所有步骤:CORS on ASP.NET
除了:
Response.AppendHeader("Access-Control-Allow-Origin", "*");
还可以尝试:
Response.AppendHeader("Access-Control-Allow-Methods","*");
尝试直接在 Web 配置中添加:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
如果做不到这一点,您需要确保可以控制这两个域。
仅供参考,在经典网络表单中启用 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 }
);
如果您需要印前检查请求,例如,以便您可以发送经过身份验证的请求,则无法设置Access-Control-Allow-Origin: *
。它必须是特定的Origin
域。
此外,如果您使用默认值以外的任何内容,则必须设置 Access-Control-Allow-Methods
和 Access-Control-Allow-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) 设置缓存策略,则在使用缓存对象模型时,可能会删除与缓存相关的 HTTP 响应标头。此行为使 ASP.NET 能够维护最严格的设置。例如,考虑包含用户控件的页面。如果这些控件具有冲突的缓存策略,则将使用限制性最强的缓存策略。如果一个用户控件设置标头"Cache-Control: Public",而另一个用户控件通过调用 SetCacheability 设置限制性更强的标头"Cache-Control: Private",则"Cache-Control: Private"标头将与响应一起发送。
您可以在 Web 配置中为 customHeaders 创建一个 httpProtocol。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" values="*" />
</customHeaders>
<httpProtocol>
对于 Web 表单,您可以使用
Response.AddHeader("Access-Control-Allow-Origin", "*");
而不是
Response.AppendHeader("access-control-allow-origin", "*");
第一个适用于旧版本的 ASP.Net Web Form。
我认为您的代码看起来不错,但 IIS 不会单独发送标头实体并预期响应。请检查 IIS 配置是否正确。
- 配置 IIS6
- 配置 IIS7
如果 CORS 不适用于您的特殊性问题,也许 jsonp 是另一种可能的方法。
你可以在 MVC 中这样做
[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
{
Response.AppendHeader("Access-Control-Allow-Origin", "*");
return View();
}