Вызов ServiceHost.Close()
позволяет элегантно завершить работу экземпляра хоста, позволяя завершать текущие вызовы и одновременно отказывать в будущих клиентских вызовах. Предполагая, что ServiceHost.CloseTimeout
установлен на 10 секунд, тогда экземпляр ServiceHost
будет блокироваться на 10 секунд, ожидая, пока Close()
вернет
а) Что произойдет, если Close()
не вернется в течение 10 секунд? Будет ли ServiceHost
экземпляр принудительно отключаться без каких-либо исключений?
b) Каковы общие сценарии, когда Close()
не возвращается в течение указанного времени? Возможно, когда клиентский звонок еще обрабатывается?
спасибо
РЕПЛИКА:
Я в замешательстве. В вашем примере хост службы действительно ожидает завершения операции, но в моем примере это не так, поскольку Console.WriteLine("GetDog completed");
(вызывается в GetDog()
) не выполняется:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Threading;
namespace ConsoleApplication1
{
[ServiceContract]
public interface IDogs
{
[OperationContract]
string GetDog();
}
public class Animals : IDogs
{
public string GetDog()
{
Thread.Sleep(30000);
Console.WriteLine("GetDog completed"); // this doesn't get executed
return "dalmatian";
}
}
class Program
{
static void Main(string[] args)
{
ServiceHost host1 =
new ServiceHost(typeof(Animals),new Uri("http://localhost:8000"));
host1.AddServiceEndpoint(typeof(IDogs), new BasicHttpBinding(), "Dogs");
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
host1.Description.Behaviors.Add(behavior);
host1.AddServiceEndpoint(
typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
host1.Open();
Thread.Sleep(6000);
host1.Close();
}
}
Кстати, почему не генерируется исключение в основном потоке (который вызывает host.Close()
)? Вместо этого он выбрасывается из потока, который выполняет Service.doFoo()
?!