Poiché ASP.NET vNext non è ancora disponibile e la mia app utilizza MVC5, dovrei migrare completamente l'app MVC a Nancy o qualcosa di simile. MVC5 è troppo dipendente da IIS.
Per risolvere questo frattempo ho deciso per una soluzione intermedia come prestazioni non è un problema:
mia console applicazione crea un file di configurazione di IIS e lancia un espresso IIS:
// start IIS
bool systray = Debugger.IsAttached;
ProcessStartInfo psi = new ProcessStartInfo(iisExecutable, String.Format("/config:\"{0}\" /site:Ecm2.Web /trace:info /systray:{1}", configFile, systray));
psi.UseShellExecute = false;
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.CreateNoWindow = true;
if (this.iisProcess != null) throw new NotSupportedException("Multiple starts not supported");
this.iisProcess = new Process();
this.iisProcess.StartInfo = psi;
this.iisProcess.ErrorDataReceived += OnErrorDataReceived;
this.iisProcess.OutputDataReceived += OnOutputDataReceived;
this.iisProcess.Start();
this.iisProcess.BeginErrorReadLine();
this.iisProcess.BeginOutputReadLine();
Se qualcuno vorrebbe , questo fa parte del frammento "stop":
if (this.iisProcess == null) throw new Exception("Does not look like there was something started yet!");
if (this.iisProcess.HasExited)
{
log.WarnFormat("IIS has already exited with code '{0}'", this.iisProcess.ExitCode);
this.iisProcess.Close();
return;
}
log.InfoFormat("Stopping IIS instance #{0}", this.instanceId);
ProcessCommunication.SendStopMessageToProcess(this.iisProcess.Id);
bool exited = this.iisProcess.WaitForExit(30000);
if (!exited)
{
log.WarnFormat("Failed to stop IIS instance #{0} (PID {1}), killing it now", this.instanceId, this.iisProcess.Id);
this.iisProcess.Kill();
}
this.iisProcess.Close();
per arrestare il processo di IIS ordinario è necessario inviare WM_QUIT ad esso. Questo potrebbe essere utile per questo:
/// <summary>
/// Sends a WM_QUIT message to another process.
/// </summary>
/// <param name="pid">PID of the other process</param>
public static void SendStopMessageToProcess(int pid)
{
log.DebugFormat("Sending stop message to PID #{0}", pid);
try
{
for (IntPtr ptr = NativeMethods.GetTopWindow(IntPtr.Zero); ptr != IntPtr.Zero; ptr = NativeMethods.GetWindow(ptr, 2))
{
uint num;
NativeMethods.GetWindowThreadProcessId(ptr, out num);
if (pid == num)
{
HandleRef hWnd = new HandleRef(null, ptr);
NativeMethods.PostMessage(hWnd, 0x12, IntPtr.Zero, IntPtr.Zero);
return;
}
}
}
catch (ArgumentException ex)
{
log.Error(String.Format("Failed to send WM_QUIT to PID #{0}", pid), ex);
}
}
/// <summary>
/// Provides the native methods to post messages to other windows processes.
/// </summary>
internal class NativeMethods
{
// Methods
[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr GetTopWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("user32.dll", SetLastError = true)]
internal static extern uint GetWindowThreadProcessId(IntPtr hwnd, out uint lpdwProcessId);
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
}
Per quanto ho ricercato ora questo non sarà possibile prima ASP.NET 5 (vNext; MVC 6) e hosting mia applicazione con tutto regolare richiederà di migrare da ASP.NET MVC a Nancy (che potrebbe anche utilizzare il motore di template Razor). Corretta? – ZoolWay
Come sopra, non è possibile "auto-ospitare" MVC, e Nancy è un framework di sviluppo web completamente diverso per MVC - non è un modo alternativo di ospitare MVC e non è possibile semplicemente combinarli insieme in questo modo. –
La domanda quindi è se c'è qualcos'altro da ospitare autonomamente o se MVC5 richiede semplicemente l'hosting IIS senza alcuna soluzione alternativa. – ZoolWay