Pass parameters to createapplication method (#998)
This commit is contained in:
parent
dfed3d7563
commit
65d3787fc4
|
|
@ -20,9 +20,11 @@
|
||||||
typedef
|
typedef
|
||||||
HRESULT
|
HRESULT
|
||||||
(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)(
|
(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)(
|
||||||
_In_ IHttpServer *pServer,
|
_In_ IHttpServer *pServer,
|
||||||
_In_ IHttpApplication *pHttpApplication,
|
_In_ IHttpApplication *pHttpApplication,
|
||||||
_Out_ IAPPLICATION **pApplication
|
_In_ APPLICATION_PARAMETER *pParameters,
|
||||||
|
_In_ DWORD nParameters,
|
||||||
|
_Out_ IAPPLICATION **pApplication
|
||||||
);
|
);
|
||||||
|
|
||||||
extern BOOL g_fRecycleProcessCalled;
|
extern BOOL g_fRecycleProcessCalled;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "applicationinfo.h"
|
#include "applicationinfo.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include "proxymodule.h"
|
#include "proxymodule.h"
|
||||||
#include "hostfxr_utility.h"
|
#include "hostfxr_utility.h"
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
|
|
@ -222,8 +223,16 @@ APPLICATION_INFO::EnsureApplicationCreated(
|
||||||
FINISHED(HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION));
|
FINISHED(HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION));
|
||||||
}
|
}
|
||||||
|
|
||||||
FINISHED_IF_FAILED(m_pfnAspNetCoreCreateApplication(m_pServer, pHttpContext->GetApplication(), &pApplication));
|
std::array<APPLICATION_PARAMETER, 1> parameters {
|
||||||
pApplication->SetParameter(L"InProcessExeLocation", struExeLocation.QueryStr());
|
{"InProcessExeLocation", struExeLocation.QueryStr()}
|
||||||
|
};
|
||||||
|
|
||||||
|
FINISHED_IF_FAILED(m_pfnAspNetCoreCreateApplication(
|
||||||
|
m_pServer,
|
||||||
|
pHttpContext->GetApplication(),
|
||||||
|
parameters.data(),
|
||||||
|
static_cast<DWORD>(parameters.size()),
|
||||||
|
&pApplication));
|
||||||
|
|
||||||
m_pApplication = pApplication;
|
m_pApplication = pApplication;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,16 +40,6 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
SetParameter(
|
|
||||||
_In_ LPCWSTR pzName,
|
|
||||||
_In_ LPCWSTR pzValue)
|
|
||||||
override
|
|
||||||
{
|
|
||||||
UNREFERENCED_PARAMETER(pzName);
|
|
||||||
UNREFERENCED_PARAMETER(pzValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
volatile APPLICATION_STATUS m_status = APPLICATION_STATUS::UNKNOWN;
|
volatile APPLICATION_STATUS m_status = APPLICATION_STATUS::UNKNOWN;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,12 @@ enum APPLICATION_STATUS
|
||||||
FAIL
|
FAIL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct APPLICATION_PARAMETER
|
||||||
|
{
|
||||||
|
LPCSTR pzName;
|
||||||
|
PVOID pValue;
|
||||||
|
};
|
||||||
|
|
||||||
class IAPPLICATION
|
class IAPPLICATION
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -46,10 +52,4 @@ public:
|
||||||
CreateHandler(
|
CreateHandler(
|
||||||
_In_ IHttpContext *pHttpContext,
|
_In_ IHttpContext *pHttpContext,
|
||||||
_Out_ IREQUEST_HANDLER **pRequestHandler) = 0;
|
_Out_ IREQUEST_HANDLER **pRequestHandler) = 0;
|
||||||
|
|
||||||
virtual
|
|
||||||
VOID
|
|
||||||
SetParameter(
|
|
||||||
_In_ LPCWSTR pzName,
|
|
||||||
_In_ LPCWSTR pzValue) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -82,9 +82,11 @@ BOOL APIENTRY DllMain(HMODULE hModule,
|
||||||
HRESULT
|
HRESULT
|
||||||
__stdcall
|
__stdcall
|
||||||
CreateApplication(
|
CreateApplication(
|
||||||
_In_ IHttpServer *pServer,
|
_In_ IHttpServer *pServer,
|
||||||
_In_ IHttpApplication *pHttpApplication,
|
_In_ IHttpApplication *pHttpApplication,
|
||||||
_Out_ IAPPLICATION **ppApplication
|
_In_ APPLICATION_PARAMETER *pParameters,
|
||||||
|
_In_ DWORD nParameters,
|
||||||
|
_Out_ IAPPLICATION **ppApplication
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
REQUESTHANDLER_CONFIG *pConfig = NULL;
|
REQUESTHANDLER_CONFIG *pConfig = NULL;
|
||||||
|
|
@ -97,11 +99,11 @@ CreateApplication(
|
||||||
|
|
||||||
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(pConfig);
|
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(pConfig);
|
||||||
|
|
||||||
BOOL disableStartupPage = pConfig->QueryDisableStartUpErrorPage();
|
const bool disableStartupPage = pConfig->QueryDisableStartUpErrorPage();
|
||||||
|
|
||||||
auto pApplication = std::make_unique<IN_PROCESS_APPLICATION>(pServer, std::move(config));
|
auto pApplication = std::make_unique<IN_PROCESS_APPLICATION>(pServer, std::move(config), pParameters, nParameters);
|
||||||
|
|
||||||
if (FAILED(pApplication->LoadManagedApplication()))
|
if (FAILED_LOG(pApplication->LoadManagedApplication()))
|
||||||
{
|
{
|
||||||
// Set the currently running application to a fake application that returns startup exceptions.
|
// Set the currently running application to a fake application that returns startup exceptions.
|
||||||
*ppApplication = new StartupExceptionApplication(pServer, disableStartupPage);
|
*ppApplication = new StartupExceptionApplication(pServer, disableStartupPage);
|
||||||
|
|
|
||||||
|
|
@ -13,18 +13,22 @@
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include "LoggingHelpers.h"
|
#include "LoggingHelpers.h"
|
||||||
|
|
||||||
|
const LPCSTR IN_PROCESS_APPLICATION::s_exeLocationParameterName = "InProcessExeLocation";
|
||||||
|
|
||||||
IN_PROCESS_APPLICATION* IN_PROCESS_APPLICATION::s_Application = NULL;
|
IN_PROCESS_APPLICATION* IN_PROCESS_APPLICATION::s_Application = NULL;
|
||||||
|
|
||||||
IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
|
IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
|
||||||
IHttpServer *pHttpServer,
|
IHttpServer *pHttpServer,
|
||||||
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig) :
|
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig,
|
||||||
|
APPLICATION_PARAMETER *pParameters,
|
||||||
|
DWORD nParameters) :
|
||||||
|
InProcessApplicationBase(pHttpServer),
|
||||||
m_pHttpServer(pHttpServer),
|
m_pHttpServer(pHttpServer),
|
||||||
m_ProcessExitCode(0),
|
m_ProcessExitCode(0),
|
||||||
m_fBlockCallbacksIntoManaged(FALSE),
|
m_fBlockCallbacksIntoManaged(FALSE),
|
||||||
m_fInitialized(FALSE),
|
|
||||||
m_fShutdownCalledFromNative(FALSE),
|
m_fShutdownCalledFromNative(FALSE),
|
||||||
m_fShutdownCalledFromManaged(FALSE),
|
m_fShutdownCalledFromManaged(FALSE),
|
||||||
InProcessApplicationBase(pHttpServer),
|
m_fInitialized(FALSE),
|
||||||
m_pConfig(std::move(pConfig))
|
m_pConfig(std::move(pConfig))
|
||||||
{
|
{
|
||||||
// is it guaranteed that we have already checked app offline at this point?
|
// is it guaranteed that we have already checked app offline at this point?
|
||||||
|
|
@ -32,6 +36,13 @@ IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
|
||||||
DBG_ASSERT(pHttpServer != NULL);
|
DBG_ASSERT(pHttpServer != NULL);
|
||||||
DBG_ASSERT(pConfig != NULL);
|
DBG_ASSERT(pConfig != NULL);
|
||||||
|
|
||||||
|
for (DWORD i = 0; i < nParameters; i++)
|
||||||
|
{
|
||||||
|
if (_stricmp(pParameters[i].pzName, s_exeLocationParameterName) == 0)
|
||||||
|
{
|
||||||
|
m_struExeLocation.Copy(reinterpret_cast<PCWSTR>(pParameters[i].pValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_status = APPLICATION_STATUS::STARTING;
|
m_status = APPLICATION_STATUS::STARTING;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,9 @@ class IN_PROCESS_APPLICATION : public InProcessApplicationBase
|
||||||
public:
|
public:
|
||||||
IN_PROCESS_APPLICATION(
|
IN_PROCESS_APPLICATION(
|
||||||
IHttpServer* pHttpServer,
|
IHttpServer* pHttpServer,
|
||||||
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig);
|
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig,
|
||||||
|
APPLICATION_PARAMETER *pParameters,
|
||||||
|
DWORD nParameters);
|
||||||
|
|
||||||
~IN_PROCESS_APPLICATION();
|
~IN_PROCESS_APPLICATION();
|
||||||
|
|
||||||
|
|
@ -42,19 +44,6 @@ public:
|
||||||
_Out_ IREQUEST_HANDLER **pRequestHandler)
|
_Out_ IREQUEST_HANDLER **pRequestHandler)
|
||||||
override;
|
override;
|
||||||
|
|
||||||
VOID
|
|
||||||
SetParameter(
|
|
||||||
_In_ LPCWSTR pzName,
|
|
||||||
_In_ LPCWSTR pzValue)
|
|
||||||
override
|
|
||||||
{
|
|
||||||
const auto exeLocationParameterName = L"InProcessExeLocation";
|
|
||||||
if (_wcsicmp(pzName, exeLocationParameterName) == 0)
|
|
||||||
{
|
|
||||||
m_struExeLocation.Copy(pzValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Executes the .NET Core process
|
// Executes the .NET Core process
|
||||||
HRESULT
|
HRESULT
|
||||||
ExecuteApplication(
|
ExecuteApplication(
|
||||||
|
|
@ -162,7 +151,7 @@ private:
|
||||||
IOutputManager* m_pLoggerProvider;
|
IOutputManager* m_pLoggerProvider;
|
||||||
std::unique_ptr<REQUESTHANDLER_CONFIG> m_pConfig;
|
std::unique_ptr<REQUESTHANDLER_CONFIG> m_pConfig;
|
||||||
|
|
||||||
|
static const LPCSTR s_exeLocationParameterName;
|
||||||
|
|
||||||
static
|
static
|
||||||
VOID
|
VOID
|
||||||
|
|
|
||||||
|
|
@ -272,9 +272,13 @@ __stdcall
|
||||||
CreateApplication(
|
CreateApplication(
|
||||||
_In_ IHttpServer *pServer,
|
_In_ IHttpServer *pServer,
|
||||||
_In_ IHttpApplication *pHttpApplication,
|
_In_ IHttpApplication *pHttpApplication,
|
||||||
|
_In_ APPLICATION_PARAMETER *pParameters,
|
||||||
|
_In_ DWORD nParameters,
|
||||||
_Out_ IAPPLICATION **ppApplication
|
_Out_ IAPPLICATION **ppApplication
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
UNREFERENCED_PARAMETER(pParameters);
|
||||||
|
UNREFERENCED_PARAMETER(nParameters);
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
IAPPLICATION *pApplication = NULL;
|
IAPPLICATION *pApplication = NULL;
|
||||||
REQUESTHANDLER_CONFIG *pConfig = NULL;
|
REQUESTHANDLER_CONFIG *pConfig = NULL;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include "inprocessapplication.h"
|
#include "inprocessapplication.h"
|
||||||
#include "fakeclasses.h"
|
#include "fakeclasses.h"
|
||||||
|
|
||||||
|
|
@ -17,11 +18,13 @@ namespace InprocessTests
|
||||||
auto server = new MockHttpServer();
|
auto server = new MockHttpServer();
|
||||||
auto requestHandlerConfig = MockRequestHandlerConfig::CreateConfig();
|
auto requestHandlerConfig = MockRequestHandlerConfig::CreateConfig();
|
||||||
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(requestHandlerConfig);
|
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(requestHandlerConfig);
|
||||||
IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, std::move(config));
|
|
||||||
{
|
std::wstring exePath(L"hello");
|
||||||
std::wstring exePath(L"hello");
|
std::array<APPLICATION_PARAMETER, 1> parameters {
|
||||||
app->SetParameter(L"InProcessExeLocation", exePath.c_str());
|
{"InProcessExeLocation", exePath.data()}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, std::move(config), parameters.data(), 1);
|
||||||
ASSERT_STREQ(app->QueryExeLocation(), L"hello");
|
ASSERT_STREQ(app->QueryExeLocation(), L"hello");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using IISIntegration.FunctionalTests.Utilities;
|
using IISIntegration.FunctionalTests.Utilities;
|
||||||
|
|
@ -77,6 +78,9 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
await AssertStarts(
|
await AssertStarts(
|
||||||
deploymentResult => Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path),
|
deploymentResult => Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path),
|
||||||
deploymentParameters => deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation));
|
deploymentParameters => deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation));
|
||||||
|
|
||||||
|
// Verify that in this scenario where.exe was invoked only once by shim and request handler uses cached value
|
||||||
|
Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains("Invoking where.exe to find dotnet.exe")));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AssertStarts(Action<IISDeploymentResult> postDeploy, Action<DeploymentParameters> preDeploy = null)
|
private async Task AssertStarts(Action<IISDeploymentResult> postDeploy, Action<DeploymentParameters> preDeploy = null)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue