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 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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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."
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue