我试图在我的应用程序中删除不必要的飞行前请求。为此我已经简化了请求的某些部分,删除了自定义标题等。但是遇到了问题 - GET请求现在可以在没有预先飞行的情况下正常工作,但POST请求仍然有它们。
我已遵循要求:
GET和POST请求都通过单个httpinvoke调用。
作为一个例子 - GET请求不是在飞行前开始的:
网址:
http://mydomain/APIEndpoint/GETRequest?Id=346089&Token=f5h345
请求方法:GET
请求标题:
接受:
*/*
Accept-Encoding:gzip,deflate
接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2
缓存控制:无缓存
连接:保持活力
内容类型:文本/无格式; charset = utf-8
主持人:正确的主人
产地:
http://localhost
Pragma:no-cache
Referer:正确的引用
User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36
查询字符串参数:
编号= 346089
令牌= f5h345
一个看起来非常相似的POST请求,但仍以飞行前开头:
网址:
http://mydomain/APIEndpoint/GETRequest?param=TEST
请求方法:POST
请求标题:
接受:
*/*
Accept-Encoding:gzip,deflate
接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2
缓存控制:无缓存
连接:保持活力
的Content-Length:11
内容类型:文本/无格式; charset = UTF-8
主机:
原产地:
http://localhost
Pragma:no-cache
的Referer: User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36
查询字符串参数:
PARAM:TEST
请求有效负载
{MyData:{}}
任何建议将不胜感激!谢谢!
====更新===
根据要求,发布POST请求的转机前请求:
网址:
http://mydomain/APIEndpoint/GETRequest?param=TEST
请求方法:选项
状态代码:200 OK
响应标题
访问控制允许来源:
*
缓存控制:无缓存
的Content-Length:0
日期:2017年8月9日星期三08:02:16 GMT
过期:-1
杂注:无缓存
服务器:IIS / 8.5
X-ASPNET-版本:4.0.30319
X供电-通过:ASP.NET
请求标题
接受:
*/*
Accept-Encoding:gzip,deflate
接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2
访问控制请求-方法:POST
缓存控制:无缓存
连接:保活
主持人:正确的主人
产地:
http://localhost
杂注:无缓存
Referer:正确的引用
User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36
查询字符串参数
PARAM:TEST
它是使用httpinvoke库的遗留代码。实际执行调用的代码段:
_converters: {
'text json': function (input, reviver) {},
'json text': JSON.stringify
};
headers = {
'Content-Type': 'text/plain; charset=utf-8'
};
data = {params: "test"};
httpinvoke(url, method.toUpperCase(), {
corsExposedHeaders: ['Content-Type'],
headers: headers,
input: data,
converters: _converters,
inputType: 'json',
outputType: 'json',
timeout: self._getMessageTimeout()
}).then(function (res) {}, function (error) {});
答案 0 :(得分:3)
如果在XMLHttpRequestUpload对象上注册了事件侦听器(强制执行预检;请参阅the note on the use-CORS-preflight flag中的https://xhr.spec.whatwg.org/和a related note中的https://fetch.spec.whatwg.org/和{{}在the updated documentation on CORS preflight requests中的3}}。
httpinvoke会这样做吗?
答案 1 :(得分:1)
@Anne提到了POST发送飞行前请求的原因,尽管请求本身符合“简单请求”的规则(因此不需要预先飞行)是在XMLHttpRequestUpload事件侦听器中。
代码中可能没有提到XMLHttpRequestUpload本身,但您总是可以在xhr.upload变量中找到它。这是http-invoke库的情况。
完全无辜的代码如:
xhr.upload.onprogress = onuploadprogress;
实际上会导致强制性的飞行前请求。
感谢所有帮助解决此问题的人。