对于某些测试代码,我希望能够在几行中托管WCF服务。我想我会写一个简单的托管类:
public class WcfHost<Implementation, Contract> : IDisposable
where Implementation : class
where Contract : class
{
public readonly string Address = "net.tcp://localhost:8000/";
private ServiceHost _Host;
public WcfHost ()
{
_Host = new ServiceHost (typeof (Implementation));
var binding = new NetTcpBinding ();
var address = new Uri (Address);
_Host.AddServiceEndpoint (
typeof (Contract),
binding,
address);
_Host.Open ();
}
public void Dispose ()
{
((IDisposable) _Host).Dispose ();
}
}
可以这样使用:
using (var host = new WcfHost<ImplementationClass, ContractClass> ()) {
这种方法有什么问题吗?代码中是否存在缺陷(特别是关于处置)?
答案 0 :(得分:5)
如果主机处于“故障”状态,主机的Dispose方法可能会抛出异常。如果发生这种情况,您将无法看到原始异常丢失时实际出现的问题。对于测试代码,这可能不是问题,但如果你试图弄清楚为什么某些东西不起作用,那么它仍然可以阻挡你。
我没有测试它,但在Dispose方法中应该可以使用以下内容:
if (_Host.State == CommunicationState.Faulted)
{
_Host.Abort();
}
else
{
_Host.Close();
}
答案 1 :(得分:0)
如果您对固定绑定和服务器地址的限制没有问题,这对我来说似乎很好。
只要您希望主机可用,您必须确保using
中的代码有效。
答案 2 :(得分:0)
如果我要实现自主机,我会使用OnStart和OnStop事件将它放在Windows服务中。此外,请针对最佳做法进行以下更改:
您还可以查看MSDN: http://msdn.microsoft.com/en-us/library/ms730158%28v=VS.90%29.aspx 有一个很好的“如何在Windows服务中托管服务”