公司项目H5调用接口遇到Response for preflight has invalid HTTP status code 405这样的错误,是使用PUT方式提交请求接口。Content-Type设置为application/json,JS代码如下:
$.ajax({
type: "PUT",
url: "http://172.16.200.84:8977/Messages?sessionId=ee876bfbtest",
data:data,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Content-Type", "application/json");
},
success: function (data, textStatus) {
alert(data);
}
});
项目使用的是MVC,而不是WebApi,按照网上的比较通用的方法是直接在MVC项目的webconfig里配置如下节点:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
</system.webServer>
当然配置后依然没有成功,接下来再试一次还是失败。还是原来的错误。

开始翻墙找各种原因,后来注意到失败的请求Method是OPTIONS,奇怪了,明明是PUT请求,怎么出现了Method为OPTIONS的请求呢?又看到一个外国友人说要在Global.asax里加上如下处理:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.End();
}
}
再试一次,成功了。但是看记录,会有两个请求,一个是OPTIONS请求返回200成功,一个是自己的PUT请求,返回200成功。那么这个OPTIONS请求到底是什么?百度了一下得到了答案:
Preflighted Requests(预检请求)
Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。
下面的2种情况需要进行预检:
1、简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求;
2、中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等。
原来如此,在js发起PUT请求的时候,头部设置了XMLHttpRequest.setRequestHeader("Content-Type", "application/json"),所以请求的时候会多出一个OPTIONS,如果去掉这个头,就不会多出这次请求了。
当然为了安全起见,可以不配置Web.Config,而是自己定义一个ActionAllowOriginAttribute,继承于ActionFilterAttribute,然后对需要跨域访问的接口加上标签就行了,主要是在header加上如下内容:
response.AddHeader("Access-Control-Allow-Origin", "*");
response.AddHeader("Access-Control-Allow-Methods", "PUT,GET,POST,OPTIONS");
response.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-File-Name");
这个网上有很多示例,这里就不再赘述了。
3
为您推荐
在使用 Entity Framework (EF) SQLite 时可能遇到的一些问题,下面是一些常见的问题和对应的解决方案。1. 无法找到适配器或数据库提供程序运行 EF 时提示类似以下错误:No database provider has been configured fo..
FreeSql 是一个功能强大的 .NET 开源 ORM(对象关系映射)工具,支持多种数据库类型并提供丰富的功能特性。以下是使用 FreeSql 过程中常见的问题及其解决方法:1. 数据库连接问题问题描述:无法连接数据库,报错提示..
在 SQL Server 中使用 UUID(全称:Universally Unique Identifier) 作为主键确实可能带来一些性能问题,特别是在大型数据库和高写入负载的场景下。以下是一些关键的性能挑战及其原因:1. 无序插入导致索引碎片化UU..
我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..
在网页设计和开发中,CLS(Cumulative Layout Shift)是指页面布局的累计偏移量。当一个用户与页面互动时,如果页面的某些元素突然改变位置或大小,导致整个布局发生偏移,就会产生布局偏移。这种偏移可能会影响用户..
今天开发做一个登陆界面,登陆成功后通过Response.Redirect重定向到登陆后的目标页面。 目标页面做了登陆验证,如果Session中用户信息不存在,则需要重新登陆。结果发现登陆成功后,将用户信息保存到了Session中,..
在IIS部署.NET Core网站报错HTTP Error 500.31 - ANCM Failed to Find Native Dependencies。原因是需要安装.NET Core运行时和ASP.NET Hosting。1 安装.NET Core运行时,目前最新的是ASP.NET Core 运行时 6.0.10(可..
@helper 是 ASP.NET Razor 视图引擎的一种语法,它允许你在 Razor 视图中定义和使用自定义 HTML 帮助程序。这些帮助程序可以被多次调用,以生成复杂的 HTML。在ASP.NET MVC中可以使用@helper定义一个返回IHtmlString..
.NET Core网站按F5运行时,在Program.cs里运行到app.Run()的时候报错:System.InvalidOperationException:“Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer ..
使用.NET Core做一个爬虫工具,使用HttpClinet下载网页时得到了HttpResponseMessage并且状态是200,但是调用ReadAsStringAsync方法时报错:System.InvalidOperationException: The character set provided in Conten..
开发模块中遇到,视频点击不增加人气,统计不到点击数的解决方法!不管怎么点击都不增加人气,人气始终为 0在头部文件加入home.js一般集成在include.html文件内!<script src="{$maccms.path}static/js/home.js"></s..
最近火热的ChatGPT究竟是什么?要如何注册ChatGPT账号去使用?ChatGPT,是由美国人工智能研究实验室OpenAI开发的一种先进的聊天机器人模型。它能够学习和理解人类的语言进行对话,同时根据聊天的上下文进行互动,协..
在 VS Code 中创建 C# MVC 脚手架有两种方法:方法一:使用命令行打开一个终端窗口,并导航到您要创建项目的目录。输入以下命令:dotnet new mvc --name MyApp这将创建一个名为 MyApp 的新 C# MVC 项目。方法二:使..
在.NET中解决内存泄漏问题是非常重要的,因为它会导致程序占用过多的内存,最终可能导致应用程序崩溃。以下是一些解决内存泄漏问题的常用方法:使用IDisposable接口和using语句实现IDisposable接口并在类中使用using..
许多有经验的面试官觉得问面试者一些问题是很浪费时间的,所以面试官总会在面试最后问“你有什么问题需要问我吗?” 一般的求职者并不会太关注面试官会怎样回答自己的问题,他们更多的只是想让自己问出..
Android Volley BasicNetwork:performRequest:Unexpected response code 302 for http://xxx异常,这个http://xxx的接口在浏览器中打开可以正常访问。接口做了302重定向,从http重定向到https的地址去了。Volley对重..
android启动页白屏和图片自适应问题,自适应官方给的说法也只是做多套图去适配不同的分辨率,本文通过几个设置几行代码即可解决启动页短暂白屏和自适应问题。网上的说法是通过启动页代码裁切图片或者在ImageView中设..
百度站长平台目前已经建议网站使用HTTPS了。百度搜索的原话是这样的,从网站安全和用户体验上来讲,HTTPS站点更为安全优质,而百度搜索在索引的时候会考虑优先展现用户体验较好的页面;预计在2018年下半年,HTTPS将..
在.NET开发中,以下是一些常见的安全性问题,以及相应的解决方法:跨站脚本攻击(XSS):XSS攻击是通过向应用程序注入恶意脚本来攻击用户的浏览器。为防止XSS攻击,可以使用输入验证和输出编码来过滤和转义用户输入..
JSON是各种编程语言中都很常用的数据格式,如Java,JavaScript,C#等语言中都常用JSON传输数据或保存一些配置信息,要序列化或反序列化字符串,在代码中需要有对应与JSON内容的类才方便实现。vscode是非常强大的插件..