WCF关闭ServiceHost时等待操作完成

Álv*_*ier 5 .net c# wcf soap

我创建一个WCF SOAP服务器,其操作需要一些时间来执行:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    string LongRunningOperation();
}

[ServiceBehavior(
    ConcurrencyMode = ConcurrencyMode.Multiple,
    UseSynchronizationContext = false,
    InstanceContextMode = InstanceContextMode.Single)]
class MyService : IMyService
{
    public string LongRunningOperation()
    {
        Thread.Sleep(20000);
        return "Hey!";
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyService instance = new MyService();
        ServiceHost serviceHost = new ServiceHost(instance);
        BasicHttpBinding binding = new BasicHttpBinding();
        serviceHost.AddServiceEndpoint(typeof(IMyService), binding, "http://localhost:9080/MyService");
        serviceHost.Open();
        Console.WriteLine("Service running");
        Thread.Sleep(10000);
        serviceHost.Close();
        Console.WriteLine("Service closed");
        Thread.Sleep(30000);
        Console.WriteLine("Exiting");
    }
}
Run Code Online (Sandbox Code Playgroud)

ServiceHost打开,10秒后关闭它.

调用serviceHost.Close()时,当前连接的所有客户端(等待LongRunningOperation完成)将立即断开连接.

是否等待以更清洁的方式关闭ServiceHost?也就是说,我想要禁用服务侦听器,还要等待所有当前连接的客户端完成(或指定最大超时).

Chr*_*son 2

原则上,我认为类似以下的事情应该是可能的,尽管我还没有实现它来确认所有细节:

  • 实现一个自定义 IOperationInvoker,包装 Dispatcher 的正常 OperationInvoker(您需要IServiceBehavior在构建服务调度程序运行时时安装包装的调用程序)
  • 自定义调用程序主要会委托给真实的调用程序,但也会提供“看门人”功能,以在服务主机即将关闭时拒绝新请求(例如引发某种异常)。
  • 它还会跟踪仍在进行中的操作调用,并在最后一个操作调用完成或超时时设置一个事件。
  • 然后,主托管线程将在调用之前等待调用者的“全部完成”事件serviceHost.Close()