调用ServiceHost.Close()
允许主机实例通过允许正在进行的呼叫完成而正常退出,同时拒绝将来的客户端调用。假设ServiceHost.CloseTimeout
设置为10秒,然后ServiceHost
实例将阻塞10秒,等待Close()
返回ServiceHost.Close不返回...
a)如果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()
?的线程抛出的!
你肯定呼叫到达GetDog()方法?将Write调用添加到方法的开头。 – 2010-11-07 19:21:23