我有一个 ASP.NET 网站(不是 Web 应用程序),它使用 JQuery 2.1.4 对 ASP.NET 6.0 REST API 进行 AJAX POST 调用。
当我调用该方法时,我收到 COR 错误。 然而,当我向同一控制器中的不同方法发出 GET AJAX 请求时,请求成功。
我的 AJAX 帖子:
function insertLNItemStorageRequirement() {
var tempLNStorage = {
TItem: storageTempReq.t_item,
TSrq1: storageTempReq.t_srq1,
TSrq2: storageTempReq.t_srq2,
TSq27: storageTempReq.t_sq27,
TStmp: storageTempReq.t_stmp,
TRcdVers: 0,
TRefcntd: 0,
TRefcntu: 0,
};
$.ajax({
type: "POST",
url: commonAPIURL + "api/LN/InsertItemStorageRequirement",
data: JSON.stringify(tempLNStorage),
contentType: 'application/json; charset=utf-8',
//dataType: "json",
xhrFields: {withCredentials: true},
success: function (response) {
},
failure: function (response) {
alert(response.responseText);
},
error: function (response) {
alert(response.responseText);
}
});
}
这是正在调用的 .NET REST API 方法:
[HttpPost("InsertItemStorageRequirement")]
[Produces(typeof(IActionResult))]
public IActionResult InsertItemStorageRequirement([FromBody] Ttccgs016424 itemStorageReq)
{
Ttccgs016424 newItemStorageReq = _LN.Ttccgs016424s.FirstOrDefault(s => s.TItem == itemStorageReq.TItem);
if (newItemStorageReq == null)
{
newItemStorageReq = new Ttccgs016424()
{
TItem = itemStorageReq.TItem,
TSrq1 = itemStorageReq.TSrq1,
TSrq2 = itemStorageReq.TSrq2,
TSq27 = itemStorageReq.TSq27,
TStmp = itemStorageReq.TStmp,
TRcdVers = itemStorageReq.TRcdVers,
TRefcntd = itemStorageReq.TRefcntd,
TRefcntu = itemStorageReq.TRefcntu
};
try
{
_LN.Ttccgs016424s.Add(newItemStorageReq);
_LN.SaveChanges();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return StatusCode(StatusCodes.Status201Created);
}
else
{
return StatusCode(StatusCodes.Status412PreconditionFailed, "Item Storage Requirement already exists.");
}
}
这是我的startup.cs中API的COR配置(请注意,我的origin是origins数组的一部分):
services.AddCors(setup => {
setup.DefaultPolicyName = "open";
setup.AddDefaultPolicy(p => {
p.AllowAnyHeader();
p.WithMethods("OPTIONS", "GET", "POST", "PUT", "DELETE");
p.WithOrigins(origins);
p.AllowCredentials();
});
});
发送的请求标头:
OPTIONS /api/LN/InsertItemStorageRequirement HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:31227
Origin: http://localhost:14612
Referer: http://localhost:14612/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36 Edg/128.0.0.0
回应:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Wed, 11 Sep 2024 23:43:25 GMT
Content-Length: 5995
我尝试更改 AJAX 调用以使用“credentials: 'include'”。
并尝试更改“data: '{itemStorageReq: "' + JSON.stringify(tempLNStorage) + '"}'。
都没有成功向 API 发送 POST。
对 API 的同一控制器中的不同方法的 GET 请求会成功。
我怀疑这并不是真正的 COR 问题,而是 AJAX 发送的数据与 API 期望的数据不匹配。
关于如何解决此问题有什么建议吗?
谢谢你。
您共享的错误消息包含
WWW-Authenticate: NTLM
,因此不包含 Windows 身份验证凭据的预检请求将被阻止并收到 401 错误。由于预检请求无法获取所需的 CORS 策略,因此 POST 请求获取 CORS 错误是预期的行为。类似于这张票。
由于您在本地工作,解决方法是允许匿名。在您的 API 项目
launchsettings.json
中,您可能需要如下设置 "anonymousAuthentication": true
。
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
}