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 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

View File

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

View File

@ -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;

View File

@ -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)
{

View File

@ -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.

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

View File

@ -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;
}

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_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."