【问题标题】:Completed Event not triggering for web service on some systems在某些系统上未触发 Web 服务的已完成事件
【发布时间】:2011-01-12 18:30:07
【问题描述】:

这是我在 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 也有很多其他方法,并且它们都工作正常......我只有这个方法有问题......

谢谢...

【问题讨论】:

    标签: c# silverlight wcf


    【解决方案1】:

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

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

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

    (3) 如here 所述,使用 MS Service Trace Viewer 查看是否有任何明显错误(通常以红色突出显示很有帮助)。

    您可能还有其他事情可以检查,但这会让您忙碌一天左右:-)。

    (代码发布后进行的编辑)

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

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

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

    【讨论】:

    • 谢谢肯.. 我会试试这些.. 我已经添加了一些代码.. 现在在我的描述中... :)
    • 添加了更多尝试。
    • 感谢 Ken 的帮助。实际上这个问题是由于浏览器无法呈现某些特殊字符造成的。:)
    【解决方案2】:

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

    【讨论】:

    • 你能详细说明你的答案吗,因为我也有同样的问题。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 2017-01-24
      • 1970-01-01
      • 2023-01-30
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多