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 调用 - 对预检请求的响应未通过访问控制检查

如何在 Asp.Net WebForm 中调用 Web API?