如何允许 ASP.NET WebForms 端点的 CORS?
Posted
技术标签:
【中文标题】如何允许 ASP.NET WebForms 端点的 CORS?【英文标题】:How to allow CORS for ASP.NET WebForms endpoint? 【发布时间】:2016-06-08 05:56:53 【问题描述】:我正在尝试将一些 [WebMethod]
带注释的端点函数添加到 Webforms 样式的 Web 应用程序(.aspx 和 .asmx)。
我想用 [EnableCors]
注释这些端点,从而获得所有良好的 ajax 预检功能。
VS2013 接受注释,但端点仍然不能很好地与 CORS 配合使用。 (当使用同源但不是跨源时,它们可以正常工作)。
我什至无法让它们与肮脏和肮脏的跨域功能
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");
方法 -- 我的浏览器拒绝响应,并且没有出现跨域响应标头。
如何在这些 [WebMethod]
端点中获得 CORS 功能?
【问题讨论】:
WebForms 主动使修改标题变得困难,例如一旦将某些内容发送给用户,您就无法更改标题。这是我以前使用过的一种技巧:***.com/questions/4091157/… 另一种使用 webconfig 的方法 ***.com/questions/2922178/… 还有一种更现代的方式来使用 owin 中间件操作标头:mikesdotnetting.com/article/269/… 【参考方案1】:我建议您仔细检查您是否已执行此页面上的所有步骤: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>
否则,您需要确保您对这两个域都有控制权。
【讨论】:
你是已知世界上最伟大的程序员!诗歌将被写下,地位将以你的圣名建立! 这不是正确答案,用户询问了一种在 webmethods 而不是 webapi 上启用 CORS 的方法【参考方案2】:如果您需要预检请求,例如所以你可以发送经过身份验证的请求,你不能设置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 一起使用。
【讨论】:
【参考方案3】:仅供参考,在经典网络表单中启用 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
);
【讨论】:
【参考方案4】:如果您使用 AppendHeader 方法发送缓存特定的头部,同时使用缓存对象模型(Cache)设置缓存策略,则在使用缓存对象模型时可能会删除与缓存相关的 HTTP 响应头部.此行为使 ASP.NET 能够维护最严格的设置。例如,考虑一个包含用户控件的页面。如果这些控件具有冲突的缓存策略,则将使用最严格的缓存策略。如果一个用户控件设置了标头“Cache-Control: Public”,而另一个用户控件通过调用 SetCacheability 设置了更严格的标头“Cache-Control: Private”,那么“Cache-Control: Private”标头将与回应。
您可以在 web config 中为 customHeaders 创建一个 httpProtocol。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" values="*" />
</customHeaders>
<httpProtocol>
【讨论】:
【参考方案5】:对于网页表单,可以使用
Response.AddHeader("Access-Control-Allow-Origin", "*");
而不是
Response.AppendHeader("Access-Control-Allow-Origin", "*");
第一个适用于旧版本的 ASP.Net Web 表单。
【讨论】:
【参考方案6】:我认为您的代码看起来不错,但 IIS 不会单独发送标头实体和预期的响应。请检查IIS是否配置正确。
配置IIS6 配置IIS7如果 CORS 不能解决您的特殊性问题,也许 jsonp 是另一种可能的方式。
【讨论】:
也许 json 是另一种可能的方式。怎么样? 我猜你将JSONP
误读为JSON
。 JSONP 响应是包装在函数调用中的标准 JSON 字符串。每个现代浏览器都能够评估 JSONP 响应而不受源域策略限制。您可以找到一些 c# 的解决方案,例如 ***.com/questions/14221429/…【参考方案7】:
你可以在 MVC 中这样做
[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
Response.AppendHeader("Access-Control-Allow-Origin", "*");
return View();
【讨论】:
OP 在 MVC 中没有这样做,正如他在帖子标题中指定的那样。以上是关于如何允许 ASP.NET WebForms 端点的 CORS?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Perl 与 ASP.NET Webforms 集成?
如何在 ASP.NET Webforms 中动态设置 HtmlTableCell 的值?
如何检索 HTML POST 数据以在 ASP.NET WebForms 中进行操作?