wcf服务停止响应我认为这是因为应用程序没有关闭与wcf的连接

时间:2012-02-16 08:38:19

标签: wcf

这不是我的wcf服务,但我想解决它 我需要第二意见 这是从silverlight开放服务的代码 我不能把所有代码都放在一起,因为项目非常大 我只是没有在所有项目中看到m_MdxService.close()  而且我认为随机问题wcf停止响应 唯一能解决它的问题是回收应用池 是因为silverlight没有关闭wcf对象。 wcf服务正在自己的应用程序池上运行。服务器是64位

 public abstract class CubeControl : Control, IFilter
    {
            protected MdxClient m_MdxService;
            protected GeneralClient m_GeneralService;
            protected PortalClient m_PortalService;
            protected ListsSoapClient m_PortalListsService;

     public GraphControl(string cubeName, SharedContract.Filters filter)
            : base(cubeName) 
        {
            AttachEvents();
            Init(filter); 
        }

 public override void UpdateGraph()
        {
            flipable.Visibility = Visibility.Collapsed;
            progressStackPanel.Visibility = Visibility.Visible;
            noDataStackPanel.Visibility = Visibility.Collapsed;

            DataPointEventArgs dpe;

            switch (m_DrillLevel)
            {
                case 0:
                    m_MdxService.GetGraphDataAsync(SharedContract.Enums.Query.NumberOfEmployees, Filter, null, null);
                    break;
                case 1:
                    dpe = m_DrillParam as DataPointEventArgs;
                     m_MdxService.GetGraphDataAsync(SharedContract.Enums.Query.NumberOfEmployeesYears, Filter, dpe.Key, null);
                    break;
                case 2:
                    dpe = m_DrillParam as DataPointEventArgs;
                    string temp = selectedYear + "," + dpe.Key.ToString();
                    m_MdxService.GetGraphDataAsync(SharedContract.Enums.Query.NumberOfEmployeesMonth, Filter, temp, null);
                    break;
            }
        }
     void InitServices()
            {
                m_MdxService = new MdxClient();

                m_MdxService.InnerChannel.OperationTimeout = new TimeSpan(0, 4, 0);

                m_GeneralService = new GeneralClient();

                m_GeneralService.InnerChannel.OperationTimeout = new TimeSpan(0, 4, 0);

                m_PortalService = new PortalClient();

                m_PortalService.InnerChannel.OperationTimeout = new TimeSpan(0, 4, 0);

                m_PortalListsService = new ListsSoapClient();

                m_PortalListsService.InnerChannel.OperationTimeout = new TimeSpan(0, 4, 0);
            }


      void AttachEvents()
            {
                m_MdxService.GetGraphDataCompleted += new               EventHandler<GetGraphDataCompletedEventArgs>(m_MdxService_GetGraphDataCompleted);
            }

            void m_MdxService_GetGraphDataCompleted(object sender, GetGraphDataCompletedEventArgs e)
            {
                GetGraphDataCompleted(sender, e);

                GetDataCompleted(this);
            }
    }

1 个答案:

答案 0 :(得分:0)

不是使用控件创建客户端,而是使用Silverlight客户端进行集中访问并为服务代理创建点。

EG。在您的silverlight应用程序的应用程序类中添加类型为“proxy”的成员MdxService。然后在应用程序启动时配置绑定和端点并创建实例。

然后在您的控件中使用App.Current.MdxService.GetGraphDataAsync访问它,并使用App.Current.MdxService..GetGraphDataCompleted注册已完成的事件。

这样你就有了一个服务客户端实例。

但是我认为你的问题更深入,你需要找到根本原因。如果应用程序池需要回收,那么我脑子里肯定会有其他原因。在托管服务的服务器上查看工作集的大小。可能是api导致了内存问题。如果它的大约900MB和appPool在32位模式下运行,你在服务器上遇到问题,如果是64位模式,它将能够处理更多。

可能会考虑单独运行该服务。在它自己的应用程序池中,单独编译和部署它。

希望有所帮助 干杯