【问题标题】:Cross-Origin Request Blocked Issue Between localhost Projects本地主机项目之间的跨域请求被阻止问题
【发布时间】:2019-03-05 06:56:15
【问题描述】:

我写了一个在 webform asp.net 的客户端上传文件的方法,它使用了 resumablejs 插件。 另一方面,我在 mvc 项目的控制器上编写了一个方法,并在该项目的 webconfig 中激活了 cors 来源,如下所示:

<httpProtocol>
 <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
    <add name="Access-Control-Allow-Headers" value="*"/>
  </customHeaders>
</httpProtocol>

我也用过likem这个:

[EnableCors(origins: "http://localhost:10811", headers: "*", methods: "*")]
public class UploadController : ApiController
{}

但是当我在 Firefox 中调用上传方法时,我在控制台中出现此错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5023/Home/UploadFiles. (Reason: CORS request did not succeed)

chrome 上的这个错误:

Response for preflight does not have HTTP ok status.

有一个问题:我用 mvc 项目的客户端测试了客户端方法,它的工作。 什么问题,谁能帮帮我?

【问题讨论】:

  • 客户端的网址是什么?它们是否在不同的端口上运行?
  • @NateBarbettini 这是http://localhost:10811/NewUpload.aspx,是的port:10811
  • @NateBarbettini 和 mvc 项目是:localhost:5023/Home/UploadFile
  • 那么您检查过什么预检请求确实得到了答复……?正如 Chrome 所说,它不是 200 OK。

标签: asp.net asp.net-mvc cors


【解决方案1】:

您将需要这样的操作过滤器属性:

public class AllowCORSAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

接下来根据您的要求将此属性应用于您的操作方法或控制器类。我建议在操作级别应用它,因为它不会使所有操作方法都可以跨组织访问:

[AllowCORS]
public ActionResult UploadFile()

【讨论】:

  • 我做到了,参数发送到控制器,但在控制器中请求文件计数为 0
  • 这可能是与跨域限制无关的不同问题
【解决方案2】:

按照以下说明进行操作:

  1. 将此部分添加到您的 ASP.NET MVC 项目的 web.config 中的 &lt;system.webServer&gt; 部分:
<httpProtocol>
  <customHeaders>
    <clear/>
    <add name="Access-Control-Allow-Origin" value="*"/>
  </customHeaders>
</httpProtocol>
  1. 在 global.asax 的 Application_BeginRequest 方法中添加一些代码,用于预检响应 CORS:
if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
{  
  //These headers are handling the "pre-flight" OPTIONS call sent by the browser
  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
    "*");
  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
    "OPTIONS, GET, HEAD, POST, PUT, DELETE");
  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
    "Accepts, Content-Type, Origin, Authorization, Api-Version, X-API-KEY, USERGUID");
  HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
    "1200");
  HttpContext.Current.Response.End();
}         

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
  "OPTIONS, GET, HEAD, POST, PUT, DELETE");

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
  "Accepts, Content-Type, Origin, Authorization, Api-Version, X-API-KEY, USERGUID");

HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers",
  "Authorization, Api-Version, USERGUID, WWW-Authenticate");

【讨论】:

  • ." verb="" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  • 评论中的这一点与答案有何关系?如果它是使答案起作用的一部分,那么如果您可以将其编辑到答案中将会有所帮助。如果不是,如果你能解释它的用途会有所帮助! :)
猜你喜欢
  • 2018-09-17
  • 2015-02-08
  • 1970-01-01
  • 2021-06-26
  • 2014-10-13
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多