asp.net Webforms [WebMethod]端点上的CORS端点

时间:2016-02-25 12:41:40

标签: c# .net webforms cors

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

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

VS2013接受注释,但端点仍然不能与CORS一起使用。 (当使用同源而非交叉原点时,它们工作正常。)

我甚至无法通过向下和肮脏的

使它们具有交叉起源功能
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");

方法 - 我的浏览器拒绝响应,并且不会出现跨源响应标头。

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

6 个答案:

答案 0 :(得分:11)

我建议您仔细检查是否已执行此页面上的所有步骤: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>

如果不这样做,您需要确保您可以控制两个域。

答案 1 :(得分:2)

如果您需要预检请求,例如因此您可以发送经过身份验证的请求,但您无法设置Access-Control-Allow-Origin: *。它必须是特定的Origin域 此外,如果您使用的是默认值以外的任何内容,则必须设置Access-Control-Allow-MethodsAccess-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一起工作。

答案 2 :(得分:0)

如果使用AppendHeader方法发送特定于缓存的标头并同时使用缓存对象模型(缓存)来设置缓存策略,则在使用缓存对象模型时,可能会删除与缓存相关的HTTP响应标头。此行为使ASP.NET能够维护最严格的设置。例如,考虑包含用户控件的页面。如果这些控件具有冲突的缓存策略,则将使用限制性最强的缓存策略。如果一个用户控件设置标题&#34; Cache-Control:Public&#34;另一个用户控件设置限制性更强的标题&#34; Cache-Control:Private&#34;通过调用SetCacheability,然后调用&#34; Cache-Control:Private&#34;标题将与响应一起发送。

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

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

答案 3 :(得分:0)

你可以在MVC中这样做

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

答案 4 :(得分:0)

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

Response.AddHeader(&#34; Access-Control-Allow-Origin&#34;,&#34; *&#34;);

而不是

Response.AppendHeader(&#34; Access-Control-Allow-Origin&#34;,&#34; *&#34;);

第一个适用于旧版ASP.Net Web Form。

答案 5 :(得分:-1)

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

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