.NET 如何 运行 在与监听服务总线相同的进程中使用 http 服务器

.NET How to run http server in same process as listening to servicebus

我正在尝试将 HTTP 功能添加到一个已经存在的应用程序,该应用程序 'listening' 用于事件中心发送的事件。

事件侦听器异步工作并像这样初始化:

var tasks = new List<Task>();
foreach (string hub in hubs) {
            tasks.Add(ReceiveMessagesHubAsync(hub, cancel.Token));
}
Task.WaitAll(tasks.ToArray());

我正在使用 WebApi 和 OWIN-SelfHost 创建我的 HTTP 服务器。像这样启动:

using (WebApp.Start<Startup>(url: baseAddress))
{
    Console.WriteLine("Web server running at: {0}", baseAddress);
    Thread.Sleep(-1);
}

如果我也监听事件,网络服务器没有响应。如果我禁用事件监听(注释掉 Task.WaitAll() 操作),那么网络服务器就可以工作。

我尝试在异步事件中心代码之前移动 WebApp.Start 并删除 Thread.Sleep() 操作,但这也会阻止网络服务器运行。

现在我明白这是一个线程问题,但我不知道如何解决它。我应该在新线程中执行网络服务器初始化吗?还是有其他(内置)方式,我是否使问题过于复杂?

根据我看到的 documentation,除了确保所有逻辑都在 using 语句中外,应该没有什么特别之处。

using (WebApp.Start<Startup>(url: baseAddress))
{
    Console.WriteLine("Web server running at: {0}", baseAddress);

    var tasks = new List<Task>();
    foreach (string hub in hubs) {
        tasks.Add(ReceiveMessagesHubAsync(hub, cancel.Token));
    }

    Task.WaitAll(tasks.ToArray());
}

Console.WriteLine ("Web server shut dow");

只要您超出 using 语句,您的 WebApp 就会被处理掉,它将不再侦听事件。如果 class 的结构方式不适合将所有内容保存在一个 using 语句中,那么您可以将 WebApp 存储为 class 变量,当您的整个class 正在处理,您只需处理那个 WebApp 实例。