【问题标题】:Where to close the WCF service connection in MVC在 MVC 中关闭 WCF 服务连接的位置
【发布时间】:2013-12-13 08:25:47
【问题描述】:

“WCF 服务无法用于通信,因为它处于故障状态”

我收到此错误,原因是我没有关闭与 WCF 服务的连接。过了一会儿,系统给出了这个错误。可能是当打开的连接太多时会出现错误。

public void CloseChannels()
    {
        bool success = false;
        foreach (ChannelFactory li in factoryList)
        {
            try
            {
                if (li.State == CommunicationState.Opened)
                    li.Close();
                 li.ToString()));
                success = true;
            }
            catch (Exception ex)
            {   
                Helpers.Logger.Log.Error("Could not close connection for the service",ex);
            }
            finally
            {
                if (!success)
                {
                    if (li.State == CommunicationState.Opened)
                        li.Abort();
                }
            }
        }
    }

我必须为每个服务调用调用它以确保连接已关闭。 ASP.NET MVC 中是否有一个全局位置,我可以在哪里调用它? (例如,在 ASP.NET Web 表单中,我们有页面 OnUnload 事件)

【问题讨论】:

  • 每当您使用频道时,using 块会怎样?

标签: wcf asp.net-mvc-4 wcf-binding


【解决方案1】:

当我调用我的 wcf 方法时,我总是使用“使用”,然后它会在使用完对象后关闭并处置对象。

        using (var client = new WCFServiceClient())
        {
            client.GetCountries();
        }

【讨论】:

    【解决方案2】:

    你有三个或更多的可能性来解决这个问题:

    使用
    每当您使用服务时,请在 using 块内执行。

    using (var serviceClient = new ServiceClient())
    {
        serviceClient.DoSomething();    
    }
    

    使用 IDisposable 接口(Controller 实现它)

    public override void Dispose()
    {
        _myServiceClient.Dispose();
    }
    

    使用依赖注入
    使用依赖注入和生命周期管理器,使控制器和服务客户​​端的生命周期与 http-request 相同。

    【讨论】:

    • 实际上我选择了第一个和第二个选项的组合。在创建所有服务的“服务工厂”类中,我通过实现 IDisposable 接口将其设为 Disposable,并在其中调用 close 通道方法。
    • 我更喜欢在此类对象上调用 Dispose(),但这最终可能并不重要。 (实际上对于ClientBase<T>Dispose() 调用Close()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2010-11-26
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多