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:
parent
da14806d9e
commit
2db54362a5
|
|
@ -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<APPLICATION_INFO, APPLICATION_INFO_KEY *>
|
||||
public HASH_TABLE<APPLICATION_INFO, PCWSTR>
|
||||
{
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ public:
|
|||
HRESULT
|
||||
GetOrCreateApplicationInfo(
|
||||
_In_ IHttpServer* pServer,
|
||||
_In_ ASPNETCORE_SHIM_CONFIG* pConfig,
|
||||
_In_ IHttpContext* pHttpContext,
|
||||
_Out_ APPLICATION_INFO ** ppApplicationInfo
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 <memory>
|
||||
#include "applicationmanager.h"
|
||||
|
||||
#include "proxymodule.h"
|
||||
#include "utility.h"
|
||||
#include <memory>
|
||||
|
||||
// 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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
|
|||
Loading…
Reference in New Issue