ASP.NET vNext henüz mevcut değil ve benim uygulama MVC5 kullanıyor MVC uygulamasını tamamen Nancy veya benzer bir şekilde geçirmeliyim. MVC5, IIS'ye çok bağlı.
performans bir sorun değil gibi ben bir ara çözüm üzerinde karar bu arada çözmek için:
Benim konsol uygulaması bir IIS yapılandırma dosyası oluşturur ve bir IIS ekspres başlattı:
// 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();
birisi istiyorsanız
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();
buna WM_QUIT göndermesi gerektiğini sıradan iis işlemini durdurmak için: Bu "dur" parçasının bir parçasıdır. Bu, bu yardımcı olabilir:
/// <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);
}
Bildiğim kadarıyla artık bu mümkün olmayacaktır araştırmış olarak ASP.NET 5 (vNext; MVC 6) öncesi ve nancy ile benim uygulamayı barındıran ASP.NET taşınma gerektirecektir MVC'den Nancy'ye (ayrıca Razor şablon motorunu da kullanabilir). Doğru? – ZoolWay
Yukarıdaki gibi, "kendi kendini barındıran" MVC ve Nancy, MVC için tamamen farklı bir web geliştirme çerçevesidir - bu MVC'yi barındırmanın alternatif bir yolu değildir ve bunları bir araya getiremezsiniz. –
Soru, daha sonra kendiliğinden konaklamak için başka bir şey olup olmadığı veya MVC5'in herhangi bir geçici çözüm olmadan IIS'nin barındırma gerektirip gerektirmediğidir. – ZoolWay