asp.net-mvc – 处理CORS预检请求到ASP.NET MVC操作
发布时间:2020-12-15 19:36:23 所属栏目:asp.Net 来源:网络整理
导读:我试图对ASP.NET MVC控制器操作执行跨域POST请求。这个控制器动作接受使用各种参数。问题是当预检请求发生时,控制器动作实际上尝试执行因为OPTIONS请求不传递任何数据,控制器操作抛出一个500 HTTP错误。如果我删除使用参数的代码或参数本身,整个请求链已
我试图对ASP.NET MVC控制器操作执行跨域POST请求。这个控制器动作接受&使用各种参数。问题是当预检请求发生时,控制器动作实际上尝试执行&因为OPTIONS请求不传递任何数据,控制器操作抛出一个500 HTTP错误。如果我删除使用参数的代码或参数本身,整个请求链已成功完成。
一个如何实现的示例: 控制器操作 public ActionResult GetData(string data) { return new JsonResult { Data = data.ToUpper(),JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } 客户端代码 <script type="text/javascript"> $(function () { $("#button-request").click(function () { var ajaxConfig = { dataType: "json",url: "http://localhost:8100/host/getdata",contentType: 'application/json',data: JSON.stringify({ data: "A string of data" }),type: "POST",success: function (result) { alert(result); },error: function (jqXHR,textStatus,errorThrown) { alert('Error: Status: ' + textStatus + ',Message: ' + errorThrown); } }; $.ajax(ajaxConfig); }); }); </script> 现在,每当预检请求发生时,它返回一个500 HTTP代码,因为“data”参数为null,因为OPTIONS请求不传递任何值。 服务器应用程序已经在我的本地IIS中设置在端口8100&运行客户端代码的页面在端口8200上设置,以模拟跨域调用。 我还配置了主机(在8100)与以下标题: Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST,GET Access-Control-Allow-Origin: http://localhost:8200 我发现一个解决方法是检查HTTP方法执行操作&如果它是一个OPTIONS请求只返回空白内容,否则执行动作代码。像这样: public ActionResult GetData(string data) { if (Request.HttpMethod == "OPTIONS") { return new ContentResult(); } else { return new JsonResult { Data = data.ToUpper(),JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } } 但这种方法对我来说很蠢。我考虑添加这种逻辑到属性,但即使这意味着装饰每个动作,将使用CORS调用它。 有没有更优雅的解决方案,让这个功能工作? 解决方法
所以我找到了一个解决方案工作。对于每个请求,我检查它是否是CORS请求&该请求是否带有OPTIONS动词,表明它是预检请求。如果是,我只是发送一个空的响应(当然只包含在IIS中配置的头),从而否定控制器动作执行。
然后,如果客户端确认允许基于从预检检测返回的报头执行请求,则执行实际的POST,执行控制器动作。和我的代码示例: protected void Application_BeginRequest() { if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") { Response.Flush(); } } 如前所述,这对我有用,但如果有人知道更好的方法,或我目前的实施中的任何缺陷,我将感激听到他们。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 在打开silverlight项目之前,您需要安装最新的Si
- 关于WCF的一个非常“无语”的BUG!
- asp.net – 在Web应用程序中使用声明进行身份验证和授权的实
- asp.net – 我想在div中使用li标签,但不推荐这是否有其他方
- asp.net-mvc – asp.net mvc:如何模拟Url.Content(“?”)?
- asp.net-mvc-4 – ClaimsAuthorizationManager.CheckAccess
- asp.net-core – ASP.Net核心1.1 – 迁移失败
- ASP.NET页面上的多种语言(英语,法语)
- ASP.NET框架是CLR还是BCL的一部分?
- asp.net – VirtualPathUtility.ToAbsolute()VS. Url.Conte
推荐文章
站长推荐
- asp.net-core – 为什么.net core 2.1 SPA有3个不
- asp.net-mvc-4 – 带有附加属性的ScriptBundle
- 初识ABP vNext(11):聚合根、仓储、领域服务、
- asp.net-mvc – 即使使用AllowAnonymous,SimpleM
- 使用C#实现网站用户登录
- asp.net-mvc – ASP.NET MVC中Rake路由的等价物
- asp.net – 按钮单击在更新面板中不起作用
- asp.net-mvc – 现有的MVC网站 – 集成Telerik M
- 在asp.net ajax工具包中组合脚本
- asp.net-mvc – 将参数传递给telerik asp.net mv
热点阅读