Panwang/shim (#911)

remove shim config from module context and remove application_info_key as we can use string directly
This commit is contained in:
pan-wang 2018-06-13 21:52:52 -07:00 committed by GitHub
parent da14806d9e
commit 2db54362a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 167 additions and 350 deletions

View File

@ -27,64 +27,27 @@ HRESULT
extern BOOL g_fRecycleProcessCalled; extern BOOL g_fRecycleProcessCalled;
extern PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; 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 class APPLICATION_INFO
{ {
public: public:
APPLICATION_INFO(IHttpServer *pServer) : APPLICATION_INFO() :
m_pServer(pServer), m_pServer(NULL),
m_cRefs(1), m_fAppOfflineFound(FALSE), m_cRefs(1),
m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL), m_fAppOfflineFound(FALSE),
m_fAllowStart(FALSE),
m_pAppOfflineHtm(NULL),
m_pFileWatcherEntry(NULL),
m_pConfiguration(NULL), m_pConfiguration(NULL),
m_pfnAspNetCoreCreateApplication(NULL) m_pfnAspNetCoreCreateApplication(NULL)
{ {
InitializeSRWLock(&m_srwLock); InitializeSRWLock(&m_srwLock);
} }
APPLICATION_INFO_KEY * PCWSTR
QueryApplicationInfoKey() QueryApplicationInfoKey()
{ {
return &m_applicationInfoKey; return m_struInfoKey.QueryStr();
} }
virtual virtual
@ -92,7 +55,8 @@ public:
HRESULT HRESULT
Initialize( Initialize(
_In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, _In_ IHttpServer *pServer,
_In_ IHttpApplication *pApplication,
_In_ FILE_WATCHER *pFileWatcher _In_ FILE_WATCHER *pFileWatcher
); );
@ -122,6 +86,18 @@ public:
return m_fAppOfflineFound; return m_fAppOfflineFound;
} }
BOOL QueryAllowStart()
{
return m_fAllowStart;
}
VOID
UpdateAllowStartStatus(BOOL fAllowed)
{
// no lock, as no expectation for concurrent accesses
m_fAllowStart = fAllowed;
}
VOID VOID
UpdateAppOfflineFileHandle(); UpdateAppOfflineFileHandle();
@ -134,6 +110,7 @@ public:
return m_pConfiguration; return m_pConfiguration;
} }
// //
// ExtractApplication will increase the reference counter of the application // ExtractApplication will increase the reference counter of the application
// Caller is responsible for dereference the application. // Caller is responsible for dereference the application.
@ -170,8 +147,9 @@ private:
static VOID DoRecycleApplication(LPVOID lpParam); static VOID DoRecycleApplication(LPVOID lpParam);
mutable LONG m_cRefs; mutable LONG m_cRefs;
APPLICATION_INFO_KEY m_applicationInfoKey; STRU m_struInfoKey;
BOOL m_fAppOfflineFound; BOOL m_fAppOfflineFound;
BOOL m_fAllowStart; // Flag indicates whether there is (configuration) error blocking application from starting
APP_OFFLINE_HTM *m_pAppOfflineHtm; APP_OFFLINE_HTM *m_pAppOfflineHtm;
FILE_WATCHER_ENTRY *m_pFileWatcherEntry; FILE_WATCHER_ENTRY *m_pFileWatcherEntry;
ASPNETCORE_SHIM_CONFIG *m_pConfiguration; ASPNETCORE_SHIM_CONFIG *m_pConfiguration;
@ -185,7 +163,7 @@ private:
}; };
class APPLICATION_INFO_HASH : class APPLICATION_INFO_HASH :
public HASH_TABLE<APPLICATION_INFO, APPLICATION_INFO_KEY *> public HASH_TABLE<APPLICATION_INFO, PCWSTR>
{ {
public: public:
@ -193,7 +171,7 @@ public:
APPLICATION_INFO_HASH() APPLICATION_INFO_HASH()
{} {}
APPLICATION_INFO_KEY * PCWSTR
ExtractKey( ExtractKey(
APPLICATION_INFO *pApplicationInfo APPLICATION_INFO *pApplicationInfo
) )
@ -203,19 +181,23 @@ public:
DWORD DWORD
CalcKeyHash( CalcKeyHash(
APPLICATION_INFO_KEY *key PCWSTR pszApplicationId
) )
{ {
return key->CalcKeyHash(); return HashStringNoCase(pszApplicationId);
} }
BOOL BOOL
EqualKeys( EqualKeys(
APPLICATION_INFO_KEY *key1, PCWSTR pszKey1,
APPLICATION_INFO_KEY *key2 PCWSTR pszKey2
) )
{ {
return key1->GetIsEqual(key2); return CompareStringOrdinal(pszKey1,
-1,
pszKey2,
-1,
TRUE) == CSTR_EQUAL;
} }
VOID VOID

View File

@ -71,7 +71,7 @@ public:
HRESULT HRESULT
GetOrCreateApplicationInfo( GetOrCreateApplicationInfo(
_In_ IHttpServer* pServer, _In_ IHttpServer* pServer,
_In_ ASPNETCORE_SHIM_CONFIG* pConfig, _In_ IHttpContext* pHttpContext,
_Out_ APPLICATION_INFO ** ppApplicationInfo _Out_ APPLICATION_INFO ** ppApplicationInfo
); );

View File

@ -18,46 +18,18 @@ enum APP_HOSTING_MODEL
HOSTING_OUT_PROCESS HOSTING_OUT_PROCESS
}; };
class ASPNETCORE_SHIM_CONFIG : IHttpStoredContext class ASPNETCORE_SHIM_CONFIG
{ {
public: public:
virtual virtual
~ASPNETCORE_SHIM_CONFIG(); ~ASPNETCORE_SHIM_CONFIG();
static
HRESULT
GetConfig(
_In_ IHttpServer *pHttpServer,
_In_ HTTP_MODULE_ID pModuleId,
_In_ IHttpApplication *pHttpApplication,
_Out_ ASPNETCORE_SHIM_CONFIG **ppAspNetCoreConfig
);
HRESULT HRESULT
Populate( Populate(
IHttpServer *pHttpServer, IHttpServer *pHttpServer,
IHttpApplication *pHttpContext IHttpApplication *pHttpContext
); );
VOID
ReferenceConfiguration(
VOID
) const;
VOID
DereferenceConfiguration(
VOID
) const;
VOID
CleanupStoredContext(
VOID
)
{
DereferenceConfiguration();
}
STRU* STRU*
QueryApplicationPhysicalPath( QueryApplicationPhysicalPath(
VOID VOID
@ -114,14 +86,13 @@ public:
return &m_struHandlerVersion; return &m_struHandlerVersion;
} }
private:
ASPNETCORE_SHIM_CONFIG() : ASPNETCORE_SHIM_CONFIG() :
m_cRefs(1),
m_hostingModel(HOSTING_UNKNOWN) m_hostingModel(HOSTING_UNKNOWN)
{ {
} }
mutable LONG m_cRefs; private:
STRU m_struArguments; STRU m_struArguments;
STRU m_struProcessPath; STRU m_struProcessPath;
STRU m_struApplication; STRU m_struApplication;

View File

@ -41,38 +41,51 @@ APPLICATION_INFO::~APPLICATION_INFO()
// since the former will use it during shutdown // since the former will use it during shutdown
if (m_pConfiguration != NULL) if (m_pConfiguration != NULL)
{ {
// Need to dereference the configuration instance delete m_pConfiguration;
m_pConfiguration->DereferenceConfiguration();
m_pConfiguration = NULL; m_pConfiguration = NULL;
} }
} }
HRESULT HRESULT
APPLICATION_INFO::Initialize( APPLICATION_INFO::Initialize(
_In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, _In_ IHttpServer *pServer,
_In_ IHttpApplication *pApplication,
_In_ FILE_WATCHER *pFileWatcher _In_ FILE_WATCHER *pFileWatcher
) )
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
DBG_ASSERT(pConfiguration); DBG_ASSERT(pServer);
DBG_ASSERT(pApplication);
DBG_ASSERT(pFileWatcher); 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 if (m_pConfiguration == NULL)
// earlier in case of configuration change and shutdown {
m_pConfiguration->ReferenceConfiguration(); hr = E_OUTOFMEMORY;
goto Finished;
}
hr = m_applicationInfoKey.Initialize(pConfiguration->QueryConfigPath()->QueryStr()); hr = m_pConfiguration->Populate(m_pServer, pApplication);
if (FAILED(hr)) if (FAILED(hr))
{ {
goto Finished; goto Finished;
} }
hr = m_struInfoKey.Copy(pApplication->GetApplicationId());
if (FAILED(hr))
{
goto Finished;
}
m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pFileWatcher);
if (m_pFileWatcherEntry == NULL) if (m_pFileWatcherEntry == NULL)
{ {
m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pFileWatcher); hr = E_OUTOFMEMORY;
goto Finished;
} }
UpdateAppOfflineFileHandle(); UpdateAppOfflineFileHandle();
@ -296,10 +309,11 @@ APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location)
if (FAILED(hr = FindNativeAssemblyFromHostfxr(options.get(), pstrHandlerDllName, &struFileName))) if (FAILED(hr = FindNativeAssemblyFromHostfxr(options.get(), pstrHandlerDllName, &struFileName)))
{ {
UTILITY::LogEvent(g_hEventLog, UTILITY::LogEventF(g_hEventLog,
EVENTLOG_INFORMATION_TYPE, EVENTLOG_ERROR_TYPE,
ASPNETCORE_EVENT_INPROCESS_RH_MISSING, 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; goto Finished;
} }
@ -308,10 +322,11 @@ APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location)
{ {
if (FAILED(hr = FindNativeAssemblyFromGlobalLocation(pstrHandlerDllName, &struFileName))) if (FAILED(hr = FindNativeAssemblyFromGlobalLocation(pstrHandlerDllName, &struFileName)))
{ {
UTILITY::LogEvent(g_hEventLog, UTILITY::LogEventF(g_hEventLog,
EVENTLOG_INFORMATION_TYPE, EVENTLOG_ERROR_TYPE,
ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING, 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; goto Finished;
} }
@ -582,6 +597,15 @@ APPLICATION_INFO::RecycleApplication()
0, // default creation flags 0, // default creation flags
NULL); // receive thread identifier 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) if (hThread == NULL)
{ {

View File

@ -1,11 +1,10 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information. // Licensed under the MIT License. See License.txt in the project root for license information.
#include <memory>
#include "applicationmanager.h" #include "applicationmanager.h"
#include "proxymodule.h" #include "proxymodule.h"
#include "utility.h" #include "utility.h"
#include <memory>
// The application manager is a singleton across ANCM. // The application manager is a singleton across ANCM.
APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL; APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL;
@ -17,34 +16,30 @@ APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL;
HRESULT HRESULT
APPLICATION_MANAGER::GetOrCreateApplicationInfo( APPLICATION_MANAGER::GetOrCreateApplicationInfo(
_In_ IHttpServer* pServer, _In_ IHttpServer* pServer,
_In_ ASPNETCORE_SHIM_CONFIG* pConfig, _In_ IHttpContext* pHttpContext,
_Out_ APPLICATION_INFO ** ppApplicationInfo _Out_ APPLICATION_INFO ** ppApplicationInfo
) )
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
APPLICATION_INFO *pApplicationInfo = NULL; APPLICATION_INFO *pApplicationInfo = NULL;
APPLICATION_INFO_KEY key; BOOL fExclusiveLock = FALSE;
BOOL fExclusiveLock = FALSE; BOOL fMixedHostingModelError = FALSE;
BOOL fMixedHostingModelError = FALSE; BOOL fDuplicatedInProcessApp = FALSE;
BOOL fDuplicatedInProcessApp = FALSE; PCWSTR pszApplicationId = NULL;
PCWSTR pszApplicationId = NULL; APP_HOSTING_MODEL hostingModel = HOSTING_UNKNOWN;
STACK_STRU ( strEventMsg, 256 ); STACK_STRU ( strEventMsg, 256 );
DBG_ASSERT(pServer); DBG_ASSERT(pServer);
DBG_ASSERT(pConfig); DBG_ASSERT(pHttpContext);
DBG_ASSERT(ppApplicationInfo); DBG_ASSERT(ppApplicationInfo);
*ppApplicationInfo = NULL; *ppApplicationInfo = NULL;
// The configuration path is unique for each application and is used for the // The configuration path is unique for each application and is used for the
// key in the applicationInfoHash. // key in the applicationInfoHash.
pszApplicationId = pConfig->QueryConfigPath()->QueryStr(); pszApplicationId = pHttpContext->GetApplication()->GetApplicationId();
hr = key.Initialize(pszApplicationId);
if (FAILED(hr))
{
goto Finished;
}
// When accessing the m_pApplicationInfoHash, we need to acquire the application manager // When accessing the m_pApplicationInfoHash, we need to acquire the application manager
// lock to avoid races on setting state. // lock to avoid races on setting state.
AcquireSRWLockShared(&m_srwLock); AcquireSRWLockShared(&m_srwLock);
@ -54,32 +49,24 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo(
hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS);
goto Finished; goto Finished;
} }
m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo);
ReleaseSRWLockShared(&m_srwLock); ReleaseSRWLockShared(&m_srwLock);
if (*ppApplicationInfo == NULL) 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; goto Finished;
} }
pApplicationInfo = new APPLICATION_INFO(pServer);
AcquireSRWLockExclusive(&m_srwLock); AcquireSRWLockExclusive(&m_srwLock);
fExclusiveLock = TRUE; fExclusiveLock = TRUE;
@ -89,56 +76,47 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo(
hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS);
goto Finished; goto Finished;
} }
m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo);
if (*ppApplicationInfo != NULL) if (*ppApplicationInfo != NULL)
{ {
// someone else created the application // someone else created the application
delete pApplicationInfo;
pApplicationInfo = NULL;
goto Finished; goto Finished;
} }
// hosting model check. We do not allow mixed scenario for now hr = m_pApplicationInfoHash->InsertRecord(pApplicationInfo);
// could be changed in the future if (FAILED(hr))
if (m_hostingModel != HOSTING_UNKNOWN)
{ {
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 pApplicationInfo->UpdateAllowStartStatus(TRUE);
fMixedHostingModelError = TRUE; }
hr = HRESULT_FROM_WIN32(ERROR_APP_INIT_FAILURE); else
goto Finished; {
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; *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; pApplicationInfo = NULL;
} }
@ -149,54 +127,32 @@ Finished:
ReleaseSRWLockExclusive(&m_srwLock); 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) if (pApplicationInfo != NULL)
{ {
pApplicationInfo->DereferenceApplicationInfo(); pApplicationInfo->DereferenceApplicationInfo();
pApplicationInfo = NULL; 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; return hr;
} }
@ -237,7 +193,7 @@ APPLICATION_MANAGER::FindConfigChangedApplication(
} }
else else
{ {
pContext->MultiSz.Append(*pstruConfigPath); pContext->MultiSz.Append(pEntry->QueryApplicationInfoKey());
} }
} }
return fChanged; return fChanged;
@ -256,7 +212,6 @@ APPLICATION_MANAGER::RecycleApplicationFromManager(
) )
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
APPLICATION_INFO_KEY key;
DWORD dwPreviousCounter = 0; DWORD dwPreviousCounter = 0;
APPLICATION_INFO_HASH* table = NULL; APPLICATION_INFO_HASH* table = NULL;
CONFIG_CHANGE_CONTEXT context; CONFIG_CHANGE_CONTEXT context;
@ -276,11 +231,6 @@ APPLICATION_MANAGER::RecycleApplicationFromManager(
return hr; 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 // 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. // This will be used for finding differences in which applications are affected by a config change.
table = new APPLICATION_INFO_HASH(); table = new APPLICATION_INFO_HASH();
@ -353,13 +303,7 @@ APPLICATION_MANAGER::RecycleApplicationFromManager(
strEventMsg.QueryStr()); strEventMsg.QueryStr());
} }
hr = key.Initialize(path); table->FindKey(path, &pRecord);
if (FAILED(hr))
{
goto Finished;
}
table->FindKey(&key, &pRecord);
DBG_ASSERT(pRecord != NULL); DBG_ASSERT(pRecord != NULL);
// RecycleApplication is called on a separate thread. // RecycleApplication is called on a separate thread.

View File

@ -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 HRESULT
ASPNETCORE_SHIM_CONFIG::Populate( ASPNETCORE_SHIM_CONFIG::Populate(
IHttpServer *pHttpServer, IHttpServer *pHttpServer,
@ -205,4 +101,3 @@ Finished:
return hr; return hr;
} }

View File

@ -82,7 +82,6 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler(
) )
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
ASPNETCORE_SHIM_CONFIG *pConfig = NULL;
APPLICATION_MANAGER *pApplicationManager = NULL; APPLICATION_MANAGER *pApplicationManager = NULL;
REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE;
IAPPLICATION* pApplication = NULL; IAPPLICATION* pApplication = NULL;
@ -94,20 +93,22 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler(
goto Finished; 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)) if (FAILED(hr))
{ {
goto Finished; goto Finished;
} }
pApplicationManager = APPLICATION_MANAGER::GetInstance(); if (!m_pApplicationInfo->QueryAllowStart())
hr = pApplicationManager->GetOrCreateApplicationInfo(
g_pHttpServer,
pConfig,
&m_pApplicationInfo);
if (FAILED(hr))
{ {
// 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; goto Finished;
} }

View File

@ -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_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_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_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_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 aspnetcorerh.dll for out-of-process application. Please confirm the aspnetcorerh.dll is installed in installed globally for IIS or IISExpress." #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."