ASP.NET Web API 在来自 Chrome 扩展的并发 AJAX 调用上崩溃
Posted
技术标签:
【中文标题】ASP.NET Web API 在来自 Chrome 扩展的并发 AJAX 调用上崩溃【英文标题】:ASP.NET Web API crashes on concurrent AJAX calls from Chrome extension 【发布时间】:2019-08-30 21:32:54 【问题描述】:我有一个网站 (ASP.NET MVC),我可以在其中上传两个视频和可以调用 ASP.NET Web API 的 Chrome 扩展程序。从 Visual Studio 在 IIS 下运行的网站和 Web API 都在没有调试选项的情况下启动。
现在我将两个视频上传到我的 ASP.NET MVC 网站,并且扩展程序获得了两个上传视频的 URL。扩展设置为分别使用两个视频的两个 AJAX 调用从 Web API 控制器调用相同的操作。两个 AJAX 调用都包裹在 setInterval
中,一个间隔是 1000 毫秒,另一个是 2000 毫秒。
在 IIS 和 Chrome 控制台中,来自 ajax Web API 的 2-4 次调用偶尔会崩溃,我可以看到 net::ERR_CONNECTION_RESET
的一个错误,然后是 net::ERR_CONNECTION_REFUSED
的其他错误。
我尝试调试 Web API 并将我的操作代码放在 try-catch
块中,但它没有帮助并且调试会话崩溃,没有任何异常消息或返回代码为 -1 的错误。我也尝试搜索类似的问题,但没有找到任何东西。
阿贾克斯:
setInterval(function ()
$.ajax(
url: requestApiVideo1,
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: succFunc1,
error: errFunc
);
, 1000);
setInterval(function ()
$.ajax(
url: requestApiVideo2,
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: succFunc2,
error: errFunc
);
, 1000);
当我从简单的 ajax 调用 Web API 时,这绝对不是我所期望的。 我希望 Web API 至少可以将并发 ajax 请求放入队列中。
编辑: 这是我在事件查看器中找到的:
Faulting application name: iisexpress.exe, version: 10.0.14358.1000, time stamp: 0x574fb9e6.
Faulting module name: ucrtbase.dll, version: 10.0.17134.619, time stamp: 0xf74cf274
Exception code: 0xc0000409
Fault offset: 0x000000000006ca78
Faulting process id: 0x31d8
Faulting application start time: 0x01d4ef27c034cf15
Faulting application path: C: \ Program Files \ IIS Express \ iisexpress.exe
Faulting module path: C: \ WINDOWS \ System32 \ ucrtbase.dll
Report Id: 76c3023e-f31b-412e-9c5c-07e9bb1180ba
Faulting package full name:
Faulting package-relative application ID:
更新: 我的 C# Web API 操作代码从 C++ dll 调用方法。
【问题讨论】:
既然是IIS崩溃了,看来是IIS的问题。 @wOxxOm 可能,让我检查一下 IIS 日志是否在 Documents/IIS Express 目录中。 @wOxxOm IIS 日志没有显示任何内容。但我在 Windows 事件查看器中找到了更多信息。在文件 Report.wer 中,它说导致应用程序崩溃的模块是 ucrtbase.dll,异常代码是 c0000409 【参考方案1】:我在我的 C++ dll 模块中发现了内存泄漏。这是一个没有正确释放分配内存的写入方法:
extern "C" __declspec(dllexport)
int writeToFile(const char * file1, const char * file2, const char * id)
WavFile* originalFile = wav_file_api().init(file1, READ, 1024);
WavFile* signedFile = wav_file_api().init(file2, WRITE, 1024);
int16_t buffer[1024];
size_t read_size;
char sign[17];
sprintf_s(sign, 16, "%s", id);
sign[16] = 0;
signedFile->header = originalFile->header;
fwrite(&(signedFile->header), sizeof(WavHeader), 1, signedFile->file);
while ((read_size = wav_file_api().read_next_chunk(originalFile, buffer)))
apply_sign(buffer, sign);
wav_file_api().write_next_chunk(signedFile, buffer);
wav_file_api().del(signedFile);
wav_file_api().del(originalFile);
return 1;
【讨论】:
以上是关于ASP.NET Web API 在来自 Chrome 扩展的并发 AJAX 调用上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
来自静态类的 ASP.NET Core Web API 日志记录
ASP.Net WEB API 无法 POST 来自移动设备的大型 JSON 数据
如果参数名称等于属性名称,则来自查询的 ASP.NET Core Web API 复杂类型绑定不起作用
如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证
来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查