diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h index 0648f3bf79..f1080bfa12 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h @@ -27,64 +27,27 @@ HRESULT extern BOOL g_fRecycleProcessCalled; extern PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; -// -// The key used for hash-table lookups, consists of the port on which the http process is created. -// -class APPLICATION_INFO_KEY -{ -public: - - APPLICATION_INFO_KEY( - VOID - ) : INLINE_STRU_INIT(m_struKey) - { - } - - HRESULT - Initialize( - _In_ LPCWSTR pszKey - ) - { - return m_struKey.Copy(pszKey); - } - - BOOL - GetIsEqual( - const APPLICATION_INFO_KEY * key2 - ) const - { - return m_struKey.Equals(key2->m_struKey); - } - - DWORD CalcKeyHash() const - { - return Hash(m_struKey.QueryStr()); - } - -private: - - INLINE_STRU(m_struKey, 1024); -}; - - class APPLICATION_INFO { public: - APPLICATION_INFO(IHttpServer *pServer) : - m_pServer(pServer), - m_cRefs(1), m_fAppOfflineFound(FALSE), - m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL), + APPLICATION_INFO() : + m_pServer(NULL), + m_cRefs(1), + m_fAppOfflineFound(FALSE), + m_fAllowStart(FALSE), + m_pAppOfflineHtm(NULL), + m_pFileWatcherEntry(NULL), m_pConfiguration(NULL), m_pfnAspNetCoreCreateApplication(NULL) { InitializeSRWLock(&m_srwLock); } - APPLICATION_INFO_KEY * + PCWSTR QueryApplicationInfoKey() { - return &m_applicationInfoKey; + return m_struInfoKey.QueryStr(); } virtual @@ -92,7 +55,8 @@ public: HRESULT Initialize( - _In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, + _In_ IHttpServer *pServer, + _In_ IHttpApplication *pApplication, _In_ FILE_WATCHER *pFileWatcher ); @@ -122,6 +86,18 @@ public: return m_fAppOfflineFound; } + BOOL QueryAllowStart() + { + return m_fAllowStart; + } + + VOID + UpdateAllowStartStatus(BOOL fAllowed) + { + // no lock, as no expectation for concurrent accesses + m_fAllowStart = fAllowed; + } + VOID UpdateAppOfflineFileHandle(); @@ -134,6 +110,7 @@ public: return m_pConfiguration; } + // // ExtractApplication will increase the reference counter of the application // Caller is responsible for dereference the application. @@ -170,8 +147,9 @@ private: static VOID DoRecycleApplication(LPVOID lpParam); mutable LONG m_cRefs; - APPLICATION_INFO_KEY m_applicationInfoKey; + STRU m_struInfoKey; BOOL m_fAppOfflineFound; + BOOL m_fAllowStart; // Flag indicates whether there is (configuration) error blocking application from starting APP_OFFLINE_HTM *m_pAppOfflineHtm; FILE_WATCHER_ENTRY *m_pFileWatcherEntry; ASPNETCORE_SHIM_CONFIG *m_pConfiguration; @@ -185,7 +163,7 @@ private: }; class APPLICATION_INFO_HASH : - public HASH_TABLE + public HASH_TABLE { public: @@ -193,7 +171,7 @@ public: APPLICATION_INFO_HASH() {} - APPLICATION_INFO_KEY * + PCWSTR ExtractKey( APPLICATION_INFO *pApplicationInfo ) @@ -203,19 +181,23 @@ public: DWORD CalcKeyHash( - APPLICATION_INFO_KEY *key + PCWSTR pszApplicationId ) { - return key->CalcKeyHash(); + return HashStringNoCase(pszApplicationId); } BOOL EqualKeys( - APPLICATION_INFO_KEY *key1, - APPLICATION_INFO_KEY *key2 + PCWSTR pszKey1, + PCWSTR pszKey2 ) { - return key1->GetIsEqual(key2); + return CompareStringOrdinal(pszKey1, + -1, + pszKey2, + -1, + TRUE) == CSTR_EQUAL; } VOID diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h index 5577df2de2..06c168d4b9 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h @@ -71,7 +71,7 @@ public: HRESULT GetOrCreateApplicationInfo( _In_ IHttpServer* pServer, - _In_ ASPNETCORE_SHIM_CONFIG* pConfig, + _In_ IHttpContext* pHttpContext, _Out_ APPLICATION_INFO ** ppApplicationInfo ); diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h index 36f2a18c51..401efa3010 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h @@ -18,46 +18,18 @@ enum APP_HOSTING_MODEL HOSTING_OUT_PROCESS }; -class ASPNETCORE_SHIM_CONFIG : IHttpStoredContext +class ASPNETCORE_SHIM_CONFIG { public: virtual ~ASPNETCORE_SHIM_CONFIG(); - static - HRESULT - GetConfig( - _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpApplication *pHttpApplication, - _Out_ ASPNETCORE_SHIM_CONFIG **ppAspNetCoreConfig - ); - HRESULT Populate( IHttpServer *pHttpServer, IHttpApplication *pHttpContext ); - VOID - ReferenceConfiguration( - VOID - ) const; - - VOID - DereferenceConfiguration( - VOID - ) const; - - - VOID - CleanupStoredContext( - VOID - ) - { - DereferenceConfiguration(); - } - STRU* QueryApplicationPhysicalPath( VOID @@ -114,14 +86,13 @@ public: return &m_struHandlerVersion; } -private: ASPNETCORE_SHIM_CONFIG() : - m_cRefs(1), m_hostingModel(HOSTING_UNKNOWN) { } - mutable LONG m_cRefs; +private: + STRU m_struArguments; STRU m_struProcessPath; STRU m_struApplication; diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp index 38e4d8cb80..56fcc08f6f 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp @@ -41,38 +41,51 @@ APPLICATION_INFO::~APPLICATION_INFO() // since the former will use it during shutdown if (m_pConfiguration != NULL) { - // Need to dereference the configuration instance - m_pConfiguration->DereferenceConfiguration(); + delete m_pConfiguration; m_pConfiguration = NULL; } } HRESULT APPLICATION_INFO::Initialize( - _In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, + _In_ IHttpServer *pServer, + _In_ IHttpApplication *pApplication, _In_ FILE_WATCHER *pFileWatcher ) { HRESULT hr = S_OK; - DBG_ASSERT(pConfiguration); + DBG_ASSERT(pServer); + DBG_ASSERT(pApplication); DBG_ASSERT(pFileWatcher); - m_pConfiguration = pConfiguration; + // todo: make sure Initialize should be called only once + m_pServer = pServer; + m_pConfiguration = new ASPNETCORE_SHIM_CONFIG(); - // reference the configuration instance to prevent it will be not release - // earlier in case of configuration change and shutdown - m_pConfiguration->ReferenceConfiguration(); + if (m_pConfiguration == NULL) + { + hr = E_OUTOFMEMORY; + goto Finished; + } - hr = m_applicationInfoKey.Initialize(pConfiguration->QueryConfigPath()->QueryStr()); + hr = m_pConfiguration->Populate(m_pServer, pApplication); if (FAILED(hr)) { goto Finished; } + hr = m_struInfoKey.Copy(pApplication->GetApplicationId()); + if (FAILED(hr)) + { + goto Finished; + } + + m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pFileWatcher); if (m_pFileWatcherEntry == NULL) { - m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pFileWatcher); + hr = E_OUTOFMEMORY; + goto Finished; } UpdateAppOfflineFileHandle(); @@ -296,10 +309,11 @@ APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location) if (FAILED(hr = FindNativeAssemblyFromHostfxr(options.get(), pstrHandlerDllName, &struFileName))) { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, + UTILITY::LogEventF(g_hEventLog, + EVENTLOG_ERROR_TYPE, ASPNETCORE_EVENT_INPROCESS_RH_MISSING, - ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG); + ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG, + struFileName.IsEmpty() ? s_pwzAspnetcoreInProcessRequestHandlerName : struFileName.QueryStr()); goto Finished; } @@ -308,10 +322,11 @@ APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location) { if (FAILED(hr = FindNativeAssemblyFromGlobalLocation(pstrHandlerDllName, &struFileName))) { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, + UTILITY::LogEventF(g_hEventLog, + EVENTLOG_ERROR_TYPE, ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING, - ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG); + ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG, + struFileName.IsEmpty() ? s_pwzAspnetcoreOutOfProcessRequestHandlerName : struFileName.QueryStr()); goto Finished; } @@ -582,6 +597,15 @@ APPLICATION_INFO::RecycleApplication() 0, // default creation flags NULL); // receive thread identifier } + else + { + if (m_pConfiguration->QueryHostingModel() == HOSTING_IN_PROCESS) + { + // In process application failed to start for whatever reason, need to recycle the work process + m_pServer->RecycleProcess(L"AspNetCore InProcess Recycle Process on Demand"); + } + + } if (hThread == NULL) { diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx index 7d49d91ace..cbe291a28f 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx @@ -1,11 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. +#include #include "applicationmanager.h" - #include "proxymodule.h" #include "utility.h" -#include // The application manager is a singleton across ANCM. APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL; @@ -17,34 +16,30 @@ APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL; HRESULT APPLICATION_MANAGER::GetOrCreateApplicationInfo( _In_ IHttpServer* pServer, - _In_ ASPNETCORE_SHIM_CONFIG* pConfig, + _In_ IHttpContext* pHttpContext, _Out_ APPLICATION_INFO ** ppApplicationInfo ) { - HRESULT hr = S_OK; - APPLICATION_INFO *pApplicationInfo = NULL; - APPLICATION_INFO_KEY key; - BOOL fExclusiveLock = FALSE; - BOOL fMixedHostingModelError = FALSE; - BOOL fDuplicatedInProcessApp = FALSE; - PCWSTR pszApplicationId = NULL; + HRESULT hr = S_OK; + APPLICATION_INFO *pApplicationInfo = NULL; + BOOL fExclusiveLock = FALSE; + BOOL fMixedHostingModelError = FALSE; + BOOL fDuplicatedInProcessApp = FALSE; + PCWSTR pszApplicationId = NULL; + APP_HOSTING_MODEL hostingModel = HOSTING_UNKNOWN; + STACK_STRU ( strEventMsg, 256 ); DBG_ASSERT(pServer); - DBG_ASSERT(pConfig); + DBG_ASSERT(pHttpContext); DBG_ASSERT(ppApplicationInfo); *ppApplicationInfo = NULL; // The configuration path is unique for each application and is used for the // key in the applicationInfoHash. - pszApplicationId = pConfig->QueryConfigPath()->QueryStr(); - hr = key.Initialize(pszApplicationId); - if (FAILED(hr)) - { - goto Finished; - } - + pszApplicationId = pHttpContext->GetApplication()->GetApplicationId(); + // When accessing the m_pApplicationInfoHash, we need to acquire the application manager // lock to avoid races on setting state. AcquireSRWLockShared(&m_srwLock); @@ -54,32 +49,24 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); goto Finished; } - m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); + m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo); ReleaseSRWLockShared(&m_srwLock); if (*ppApplicationInfo == NULL) { - // Check which hosting model we want to support - switch (pConfig->QueryHostingModel()) + + pApplicationInfo = new APPLICATION_INFO(); + if (pApplicationInfo == NULL) + { + hr = E_OUTOFMEMORY; + goto Finished; + } + + hr = pApplicationInfo->Initialize(pServer, pHttpContext->GetApplication(), m_pFileWatcher); + if (FAILED(hr)) { - case HOSTING_IN_PROCESS: - if (m_pApplicationInfoHash->Count() > 0) - { - // Only one inprocess app is allowed per IIS worker process - fDuplicatedInProcessApp = TRUE; - hr = HRESULT_FROM_WIN32(ERROR_APP_INIT_FAILURE); - goto Finished; - } - break; - - case HOSTING_OUT_PROCESS: - break; - - default: - hr = E_UNEXPECTED; goto Finished; } - pApplicationInfo = new APPLICATION_INFO(pServer); AcquireSRWLockExclusive(&m_srwLock); fExclusiveLock = TRUE; @@ -89,56 +76,47 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); goto Finished; } - m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); + m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo); if (*ppApplicationInfo != NULL) { // someone else created the application - delete pApplicationInfo; - pApplicationInfo = NULL; goto Finished; } - // hosting model check. We do not allow mixed scenario for now - // could be changed in the future - if (m_hostingModel != HOSTING_UNKNOWN) + hr = m_pApplicationInfoHash->InsertRecord(pApplicationInfo); + if (FAILED(hr)) { - if (m_hostingModel != pConfig->QueryHostingModel()) + goto Finished; + } + + hostingModel = pApplicationInfo->QueryConfig()->QueryHostingModel(); + + if (m_pApplicationInfoHash->Count() == 1) + { + m_hostingModel = hostingModel; + pApplicationInfo->UpdateAllowStartStatus(TRUE); + } + else + { + if (hostingModel == HOSTING_OUT_PROCESS && hostingModel == m_hostingModel) { - // hosting model does not match, error out - fMixedHostingModelError = TRUE; - hr = HRESULT_FROM_WIN32(ERROR_APP_INIT_FAILURE); - goto Finished; + pApplicationInfo->UpdateAllowStartStatus(TRUE); + } + else + { + if (hostingModel != m_hostingModel) + { + fMixedHostingModelError = TRUE; + } + else + { + fDuplicatedInProcessApp = TRUE; + } } } - hr = pApplicationInfo->Initialize(pConfig, m_pFileWatcher); - if (FAILED(hr)) - { - goto Finished; - } - - hr = m_pApplicationInfoHash->InsertRecord( pApplicationInfo ); - if (FAILED(hr)) - { - goto Finished; - } - - // - // first application will decide which hosting model allowed by this process - // - if (m_hostingModel == HOSTING_UNKNOWN) - { - m_hostingModel = pConfig->QueryHostingModel(); - } - *ppApplicationInfo = pApplicationInfo; - pApplicationInfo->StartMonitoringAppOffline(); - - // Release the locko after starting to monitor for app offline to avoid races with it being dropped. - ReleaseSRWLockExclusive(&m_srwLock); - - fExclusiveLock = FALSE; pApplicationInfo = NULL; } @@ -149,54 +127,32 @@ Finished: ReleaseSRWLockExclusive(&m_srwLock); } + // log the error + if (fDuplicatedInProcessApp) + { + UTILITY::LogEventF(g_hEventLog, + EVENTLOG_ERROR_TYPE, + ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP, + ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP_MSG, + pszApplicationId); + + } + else if (fMixedHostingModelError) + { + UTILITY::LogEventF(g_hEventLog, + EVENTLOG_ERROR_TYPE, + ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR, + ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR_MSG, + pszApplicationId, + hostingModel); + } + if (pApplicationInfo != NULL) { pApplicationInfo->DereferenceApplicationInfo(); pApplicationInfo = NULL; } - if (FAILED(hr)) - { - if (fDuplicatedInProcessApp) - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP_MSG, - pszApplicationId))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP, - strEventMsg.QueryStr()); - } - } - else if (fMixedHostingModelError) - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR_MSG, - pszApplicationId, - pConfig->QueryHostingModel()))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR, - strEventMsg.QueryStr()); - } - } - else - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_ADD_APPLICATION_ERROR_MSG, - pszApplicationId, - hr))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_ADD_APPLICATION_ERROR, - strEventMsg.QueryStr()); - } - } - } - return hr; } @@ -237,7 +193,7 @@ APPLICATION_MANAGER::FindConfigChangedApplication( } else { - pContext->MultiSz.Append(*pstruConfigPath); + pContext->MultiSz.Append(pEntry->QueryApplicationInfoKey()); } } return fChanged; @@ -256,7 +212,6 @@ APPLICATION_MANAGER::RecycleApplicationFromManager( ) { HRESULT hr = S_OK; - APPLICATION_INFO_KEY key; DWORD dwPreviousCounter = 0; APPLICATION_INFO_HASH* table = NULL; CONFIG_CHANGE_CONTEXT context; @@ -276,11 +231,6 @@ APPLICATION_MANAGER::RecycleApplicationFromManager( return hr; } - hr = key.Initialize(pszApplicationId); - if (FAILED(hr)) - { - goto Finished; - } // Make a shallow copy of existing hashtable as we may need to remove nodes // This will be used for finding differences in which applications are affected by a config change. table = new APPLICATION_INFO_HASH(); @@ -353,13 +303,7 @@ APPLICATION_MANAGER::RecycleApplicationFromManager( strEventMsg.QueryStr()); } - hr = key.Initialize(path); - if (FAILED(hr)) - { - goto Finished; - } - - table->FindKey(&key, &pRecord); + table->FindKey(path, &pRecord); DBG_ASSERT(pRecord != NULL); // RecycleApplication is called on a separate thread. diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp b/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp index 08fd9821f3..108d5f4f6c 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp @@ -12,110 +12,6 @@ ASPNETCORE_SHIM_CONFIG::~ASPNETCORE_SHIM_CONFIG() { } -VOID -ASPNETCORE_SHIM_CONFIG::ReferenceConfiguration( - VOID -) const -{ - InterlockedIncrement(&m_cRefs); -} - -VOID -ASPNETCORE_SHIM_CONFIG::DereferenceConfiguration( - VOID -) const -{ - DBG_ASSERT(m_cRefs != 0); - LONG cRefs = 0; - if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) - { - delete this; - } -} - -HRESULT -ASPNETCORE_SHIM_CONFIG::GetConfig( - _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpApplication *pHttpApplication, - _Out_ ASPNETCORE_SHIM_CONFIG **ppAspNetCoreShimConfig -) -{ - HRESULT hr = S_OK; - ASPNETCORE_SHIM_CONFIG *pAspNetCoreShimConfig = NULL; - STRU struHostFxrDllLocation; - STRU struExeAbsolutePath; - - if (ppAspNetCoreShimConfig == NULL) - { - hr = E_INVALIDARG; - goto Finished; - } - - *ppAspNetCoreShimConfig = NULL; - - // potential bug if user sepcific config at virtual dir level - pAspNetCoreShimConfig = (ASPNETCORE_SHIM_CONFIG*) - pHttpApplication->GetModuleContextContainer()->GetModuleContext(pModuleId); - - if (pAspNetCoreShimConfig != NULL) - { - *ppAspNetCoreShimConfig = pAspNetCoreShimConfig; - pAspNetCoreShimConfig = NULL; - goto Finished; - } - - pAspNetCoreShimConfig = new ASPNETCORE_SHIM_CONFIG; - - hr = pAspNetCoreShimConfig->Populate(pHttpServer, pHttpApplication); - if (FAILED(hr)) - { - goto Finished; - } - - hr = pHttpApplication->GetModuleContextContainer()-> - SetModuleContext(pAspNetCoreShimConfig, pModuleId); - - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED)) - { - delete pAspNetCoreShimConfig; - - pAspNetCoreShimConfig = (ASPNETCORE_SHIM_CONFIG*)pHttpApplication-> - GetModuleContextContainer()-> - GetModuleContext(pModuleId); - - _ASSERT(pAspNetCoreShimConfig != NULL); - - hr = S_OK; - } - else - { - goto Finished; - } - } - else - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "ASPNETCORE_SHIM_CONFIG::GetConfig, set config to ModuleContext"); - } - - *ppAspNetCoreShimConfig = pAspNetCoreShimConfig; - pAspNetCoreShimConfig = NULL; - -Finished: - - if (pAspNetCoreShimConfig != NULL) - { - delete pAspNetCoreShimConfig; - pAspNetCoreShimConfig = NULL; - } - - return hr; -} - - HRESULT ASPNETCORE_SHIM_CONFIG::Populate( IHttpServer *pHttpServer, @@ -205,4 +101,3 @@ Finished: return hr; } - diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx index 69ad025692..47d49ffcff 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx @@ -82,7 +82,6 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( ) { HRESULT hr = S_OK; - ASPNETCORE_SHIM_CONFIG *pConfig = NULL; APPLICATION_MANAGER *pApplicationManager = NULL; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; IAPPLICATION* pApplication = NULL; @@ -94,20 +93,22 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( goto Finished; } - hr = ASPNETCORE_SHIM_CONFIG::GetConfig(g_pHttpServer, g_pModuleId, pHttpContext->GetApplication(), &pConfig); + pApplicationManager = APPLICATION_MANAGER::GetInstance(); + + hr = pApplicationManager->GetOrCreateApplicationInfo( + g_pHttpServer, + pHttpContext, + &m_pApplicationInfo); if (FAILED(hr)) { goto Finished; } - pApplicationManager = APPLICATION_MANAGER::GetInstance(); - - hr = pApplicationManager->GetOrCreateApplicationInfo( - g_pHttpServer, - pConfig, - &m_pApplicationInfo); - if (FAILED(hr)) + if (!m_pApplicationInfo->QueryAllowStart()) { + // Application cannot be started due to wrong hosting mode + // the error should already been logged to window event log for the first request + hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; goto Finished; } diff --git a/src/AspNetCoreModuleV2/CommonLib/resources.h b/src/AspNetCoreModuleV2/CommonLib/resources.h index 140a573f3f..773021784a 100644 --- a/src/AspNetCoreModuleV2/CommonLib/resources.h +++ b/src/AspNetCoreModuleV2/CommonLib/resources.h @@ -43,5 +43,5 @@ #define ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND_MSG L"Could not find application executable in '%s'. ErrorCode = '0x%x'." #define ASPNETCORE_EVENT_INPROCESS_THREAD_EXCEPTION_MSG L"Application '%s' with physical root '%s' hit unexpected managed exception, ErrorCode = '0x%x. Please check the stderr logs for more information." #define ASPNETCORE_EVENT_INVALID_PROCESS_PATH_MSG L"Invalid or unknown processPath provided in web.config: processPath = %s, ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG L"Could not find the aspnetcorerh.dll for in-process application. Please confirm the Microsoft.AspNetCore.Server.IIS package is referenced in your application." -#define ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG L"Could not find the aspnetcorerh.dll for out-of-process application. Please confirm the aspnetcorerh.dll is installed in installed globally for IIS or IISExpress." +#define ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG L"Could not find the assembly '%s' for in-process application. Please confirm the Microsoft.AspNetCore.Server.IIS package is referenced in your application." +#define ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG L"Could not find the assembly '%s' for out-of-process application. Please confirm the assembly is installed correctly for IIS or IISExpress."