这不是我的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);
}
}
答案 0 :(得分:0)
不是使用控件创建客户端,而是使用Silverlight客户端进行集中访问并为服务代理创建点。
EG。在您的silverlight应用程序的应用程序类中添加类型为“proxy”的成员MdxService。然后在应用程序启动时配置绑定和端点并创建实例。
然后在您的控件中使用App.Current.MdxService.GetGraphDataAsync访问它,并使用App.Current.MdxService..GetGraphDataCompleted注册已完成的事件。
这样你就有了一个服务客户端实例。
但是我认为你的问题更深入,你需要找到根本原因。如果应用程序池需要回收,那么我脑子里肯定会有其他原因。在托管服务的服务器上查看工作集的大小。可能是api导致了内存问题。如果它的大约900MB和appPool在32位模式下运行,你在服务器上遇到问题,如果是64位模式,它将能够处理更多。
可能会考虑单独运行该服务。在它自己的应用程序池中,单独编译和部署它。
希望有所帮助 干杯