2011-01-12 36 views
0

这是我通过WCF/Silverlight应用程序面临的一个很奇怪的问题。我正在使用WCF从我的Silverlight应用程序的数据库获取数据,并且在某些系统上完成的事件不会触发WCF中的方法。我已经检查了被调用的方法执行正确返回值。我通过Fiddler进行了检查,它清楚地显示响应也具有返回的值。然而,完成的事件没有被触发。而且在少数系统中,一切都很好,我能够在完成的方法中处理返回的值。已完成在某些系统上未触发Web服务的事件

任何想法或建议将不胜感激。我曾尝试在网上搜索周围,但没有任何运气:(

以下是代码..调用方法..

void RFCDeploy_Loaded(object sender, RoutedEventArgs e) 
    { 
     btnSelectFile.IsEnabled = true; 
     btnUploadFile.IsEnabled = false; 
     btnSelectFile.Click += new RoutedEventHandler(btnSelectFile_Click); 
     btnUploadFile.Click += new RoutedEventHandler(btnUploadFile_Click); 
     RFCChangeDataGrid.KeyDown += new KeyEventHandler(RFCChangeDataGrid_KeyDown); 
     btnAddRFCManually.Click += new RoutedEventHandler(btnAddRFCManually_Click); 
     ServiceReference1.DataService1Client ws = new BEVDashBoard.ServiceReference1.DataService1Client(); 
     ws.GetRFCChangeCompleted += new EventHandler<BEVDashBoard.ServiceReference1.GetRFCChangeCompletedEventArgs>(ws_GetRFCChangeCompleted); 
     ws.GetRFCChangeAsync(); 
     this.BusyIndicator1.IsBusy = true; 
    } 

完成的事件....

void ws_GetRFCChangeCompleted(object sender, BEVDashBoard.ServiceReference1.GetRFCChangeCompletedEventArgs e) 
    { 
     PagedCollectionView view = new PagedCollectionView(e.Result); 
     view.GroupDescriptions.Add(new PropertyGroupDescription("RFC")); 
     RFCChangeDataGrid.ItemsSource = view; 
     foreach (CollectionViewGroup group in view.Groups) 
     { 
      RFCChangeDataGrid.CollapseRowGroup(group, true); 
     } 
     this.BusyIndicator1.IsBusy = false; 
    } 

请请注意,此WCF有很多其他方法,以及所有这些都工作正常....我有问题,只有这种方法...

谢谢..

+0

你能发表一些代码吗? – 2011-01-12 18:36:56

+0

已添加一些代码.. – Farukh 2011-01-13 11:45:52

回答

0

此问题是由于浏览器无法呈现的数据库返回的字段之一中的特殊字符。经过相当多的调试后,通过网络进行搜索,才发现了这一点。使用正则表达式来删除WCF中的这些特殊字符,方法中的新返回值已成功呈现在不同系统上的各种浏览器中。 :)

0

正如其他人已经指出,看看你的一些代码会有所帮助。但有些事情要检查:

(1)在Debug/Options/Debugging/General下关闭“Enable Just My Code”,并在Reference.cs文件中设置一些断点,以查看是否有低级回调方法正在受到打击。 (2)确认您正在设置已完成的事件处理程序以及代理客户端的正确实例。如果您在一个实例上设置事件处理程序,并在另一个实例上进行调用,则可能会导致您描述的行为。 (3)如here所述,使用MS服务跟踪查看器,并查看是否有任何明显错误(通常用红色突出显示)。

可能还有其他的东西你可以检查,但这会让你忙了一天左右:-)。

(编辑制作后贴码)

(4)你可能想尝试在类级别,而不是函数定义你的WS变量。从理论上讲,定义一个事件处理程序意味着它不会被垃圾收集,但它仍然有点奇怪,因为一旦你离开函数,就不再有处理了,因此不能做重要的事情,比如说关闭它。 (5)如果还没有,请尝试通过Visual Studio中的“添加服务引用”对话框重新构建代理类。我已经看到偶尔出现的奇怪问题,当Web服务发生微妙变化时,客户端并未更新以反映更改:某些方法将成功调用,其他方法则不会。 (6)如果您可能同时打开多个代理客户端实例,请考虑将它们合并为一个实例(并使用方法调用的可选“object userState”参数传递回调,所以你不会遇到多个事件处理程序被分配的可能性)。在过去,当多个实例互相访问时,我遇到了令人讨厌的问题,而我目前的最佳做法是以这样的方式构建我的代码,即一次只打开一个客户端实例。我知道这不一定是MS说的,但这是我的经历。

+0

感谢肯..我会给这些尝试..我已经添加了一些代码..在我的描述中:) :) – Farukh 2011-01-13 11:47:18

相关问题