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


我想补充一些 [WebMethod] 带注释的端点用于Webforms样式的Web应用程序(.aspx和.asmx)。

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

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

我甚至不能让它们与下来和脏的交叉起源

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

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

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


8067
2018-02-25 12:41


起源

WebForms积极地使标题很难修改,例如一旦将某些内容发送给用户,您就无法更改标题。这是我之前使用过的一个hack: stackoverflow.com/questions/4091157/... - MatthewMartin
另一种方法是使用webconfig stackoverflow.com/questions/2922178/... - MatthewMartin
以及使用owin中间件操纵头文件的更现代的方法: mikesdotnetting.com/article/269/... - MatthewMartin


答案:


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

此外:

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>

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


8
2018-03-07 22:56



你是这个世界上最伟大的程序员!将写诗,状态将建立在你的圣名! - Sotiris Zegiannis


如果您需要预检请求,例如所以您可以发送经过身份验证的请求,但您无法设置 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一起工作。


2
2018-03-10 00:23





如果使用AppendHeader方法发送特定于缓存的标头,并同时使用缓存对象模型(缓存)来设置缓存策略,则在使用缓存对象模型时,可能会删除与缓存相关的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>

0
2018-03-10 11:54





你可以在MVC中这样做

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

0
2018-03-10 12:57





对于Web表单,您可以使用

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

代替

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

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


0
2018-05-23 00:28





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

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


-1
2018-03-04 06:53



也许json是另一种可能的方式。怎么样?
我猜你读错了 JSONP 如 JSON。 JSONP响应是包含在函数调用中的标准JSON字符串。每个现代浏览器都能够在没有源域策略限制的情况下评估JSONP响应。你可以找到一些像这样的c#解决方案 stackoverflow.com/questions/14221429/... - stanleyxu2005