4

对于一些测试代码,我希望能够在几行中托管 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> ()) {

这种方法有什么问题吗?代码中是否存在缺陷(尤其是关于处置)?

4

3 回答 3

5

如果主机处于“故障”状态,则主机的 Dispose 方法可能会引发异常。如果发生这种情况,您将看不到实际出了什么问题,因为原始异常丢失了。对于测试代码,这可能不是问题,但如果您试图找出为什么某些东西不起作用,它仍然可能会妨碍您。

我没有测试它,但在您的 Dispose 方法中应该可以:

if (_Host.State == CommunicationState.Faulted)
{
    _Host.Abort();
}
else
{
    _Host.Close();
}
于 2010-04-12T11:29:41.733 回答
0

如果您可以接受固定绑定和服务器地址的限制,这对我来说似乎很好。

using只要您希望主机可用,您必须确保其中的代码持续存在。

于 2010-04-12T10:21:08.530 回答
0

如果我要实现那个 Self Host,我会使用 OnStart 和 OnStop 事件将它放在 Windows 服务中。此外,对最佳实践进行以下更改:

  • 将端点配置放在 App.Config 文件中 - 更好地在生产环境中管理。
  • 将主机服务与实施和合同二进制文件分开。

您还可以查看 MSDN: http: //msdn.microsoft.com/en-us/library/ms730158%28v=VS.90%29.aspx 有一个很好的“在 Windows 服务中托管服务”的方法

于 2010-04-12T12:55:08.507 回答