已完成事件在某些系统上不会触发Web服务

时间:2011-01-12 18:30:07

标签: c# silverlight wcf

这是我在WCF / Silverlight应用程序面临的相当奇怪的问题。我正在使用WCF从我的Silverlight应用程序的数据库中获取数据,并且在某些系统上,已完成的事件不会触发WCF中的方法。我检查了被调用的方法正确执行后返回值。我通过Fiddler进行了检查,它清楚地表明响应也有返回值。但是,已完成的事件未被触发。此外,在一些系统中,一切都很好,我能够在已完成的方法中处理返回的值。

任何想法或建议都将不胜感激。我试过在网上搜索但没有任何运气:(

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

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还有很多其他方法,所有这些方法都正常工作....我只有这个方法有问题...

...谢谢

3 个答案:

答案 0 :(得分:0)

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

(1)在Debug / Options / Debugging / General下关闭“Enable Just My Code”,并在Reference.cs文件中设置一些断点,以查看是否有任何低级回调方法被命中。

(2)确认您正在设置已完成的事件处理程序,以及正确的代理客户端实例。如果您在一个实例上设置事件处理程序,并在另一个实例上进行调用,则可能会导致您所描述的行为。

(3)使用MS服务跟踪查看器,如here所述,查看是否有任何明显的错误(通常以红色突出显示)。

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

(代码发布后编辑)

(4)您可能想尝试在类级别而不是函数中定义ws变量。从理论上讲,在它上面定义一个事件处理程序意味着它不会被垃圾收集,但它仍然有点奇怪,因为一旦你不在函数中,你就再也没有它了,因此,不能做重要的事情,比如关闭它。

(5)如果还没有,请尝试通过Visual Studio中的“添加服务引用”对话框重建代理类。我已经看到,当Web服务发生微妙变化并且未更新客户端以反映更改时,偶尔会出现奇怪的问题:某些方法将被成功调用,其他方法则不会。

(6)如果您可能同时打开多个代理客户端实例,请考虑将它们合并到一个实例中(并使用方法调用的可选“object userState”参数来传递回调,所以你不会遇到多个事件处理程序被分配的讨厌的可能性)。过去,当多个实例互相踩踏时,我遇到了令人讨厌的问题,而我目前的最佳做法是以一种只有一个客户端实例一次打开的方式构建我的代码。我知道这不一定是MS所说的,但这是我的经历。

答案 1 :(得分:0)

此问题是由于DB返回的某个字段中的特殊字符,浏览器无法呈现。经过大量的调试,通过网络搜索,能够找到这个。使用正则表达式删除WCF中的这些特殊字符,方法中的新返回值在不同系统上的各种浏览器中成功呈现。 :)

答案 2 :(得分:0)

确保您已在服务参考中选中“生成异步操作”。右键单击服务引用并选中该框。这为我解决了。