我们正在运行一个Windows控制台应用程序,它通过SignalR背板向多个浏览器发送SignalR消息。我们通过使用OWN.WebApp托管SignalR服务器来实现这一目的:
public class SignalRWebApp : IDisposable
{
public readonly string signalRUrl;
private IDisposable webApp;
public SignalRWebApp()
{
this.signalRUrl = String.Format("http://localhost:{0}", getFreePort());
this.webApp = null;
}
private static int getFreePort()
{
var listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
var port = ((IPEndPoint) listener.LocalEndpoint).Port;
listener.Stop();
return port;
}
public bool started { get { return this.webApp != null; } }
public void start(string signalRBackplaneConnectionString)
{
if (this.webApp != null)
return;
Action<IAppBuilder> startAction = app =>
{
app.UseCors(CorsOptions.AllowAll);
GlobalHost.DependencyResolver.UseSqlServer(signalRBackplaneConnectionString);
app.MapSignalR();
};
this.webApp = WebApp.Start(this.signalRUrl, startAction);
}
#region IDisposable
public void Dispose()
{
this.dispose(true);
GC.SuppressFinalize(this);
}
~SignalRWebApp()
{
this.dispose(false);
}
private bool alreadyDisposed;
protected virtual void dispose(bool disposing)
{
if (!this.alreadyDisposed)
{
if (disposing)
{
// dispose managed objects
if (this.webApp != null)
{
this.webApp.Dispose();
this.webApp = null;
}
}
// free unmanaged objects
// set large fields to null.
this.alreadyDisposed = true;
}
}
#endregion
}
基本上,我们创建一个SignalRWebApp对象,然后调用start(),将连接字符串传递给SqlServer背板数据库。 OWIN在后台线程中启动一个网站,我们的代码通过signalRUrl(具有动态分配的端口号的localhost)与之通信。
我的问题:这在我们的开发和QA环境中有效,但是在我们的演示环境中它没有解释就崩溃了。
我正在尝试确保我们至少捕获并记录可能发生的任何异常。事情就是这样 - 我无法看到如何捕获和记录OWIN WebApp可能抛出的任何异常。
有什么想法吗?