diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp index 7467c81b21..38eaf08c31 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp @@ -7,6 +7,7 @@ #include "applicationinfo.h" #include "exceptions.h" #include "DisconnectHandler.h" +#include "SRWExclusiveLock.h" extern BOOL g_fInShutdown; @@ -67,6 +68,7 @@ ASPNET_CORE_PROXY_MODULE::ASPNET_CORE_PROXY_MODULE(HTTP_MODULE_ID moduleId, std: m_moduleId(moduleId), m_pDisconnectHandler(nullptr) { + InitializeSRWLock(&m_requestLock); } ASPNET_CORE_PROXY_MODULE::~ASPNET_CORE_PROXY_MODULE() @@ -84,6 +86,9 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( HRESULT hr = S_OK; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; + // We don't want OnAsyncCompletion to complete request before OnExecuteRequestHandler exits + auto lock = SRWExclusiveLock(m_requestLock); + try { if (g_fInShutdown) @@ -134,6 +139,9 @@ ASPNET_CORE_PROXY_MODULE::OnAsyncCompletion( IHttpCompletionInfo * pCompletionInfo ) { + // We don't want OnAsyncCompletion to complete request before OnExecuteRequestHandler exits + auto lock = SRWExclusiveLock(m_requestLock); + try { return HandleNotificationStatus(m_pHandler->OnAsyncCompletion( diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h index c5b290a36e..8f5b680e36 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h +++ b/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h @@ -60,6 +60,7 @@ class ASPNET_CORE_PROXY_MODULE : NonCopyable, public CHttpModule std::unique_ptr m_pHandler; HTTP_MODULE_ID m_moduleId; DisconnectHandler * m_pDisconnectHandler; + SRWLOCK m_requestLock {}; }; class ASPNET_CORE_PROXY_MODULE_FACTORY : NonCopyable, public IHttpModuleFactory