使用MobileFirst 8.0的原生Windows 10客户端应用程序未处理的异常错误

时间:2016-08-24 21:59:09

标签: c# ibm-mobilefirst windows-10-universal

我为客户开发原生Windows 10客户端LOB应用程序 环境:Windows 10 Pro(在移动客户端/平板电脑和开发人员盒上),Visual Studio 2015 Professional和Update 3,安装了所有更新和补丁。客户端应用程序使用最新的“IBM MobileFirst SDK for Windows 8 Universal和Windows 10 Universal平台”版本8.0.2016070716

当应用程序联机并且可以访问MobileFirst 8.0服务器时,应用程序运行良好。 如果无法访问服务器(脱机,MFP服务器停止),我们遇到客户端应用程序的应用程序崩溃。 似乎从MobileFirst C#客户端库中启动的工作线程会引发异常。我的代码中无法使用此异常。

以下是一些演示此问题的代码:

private async Task<WorklightAccessToken> ConnectMobileFirst()
{
    try
    {
        IWorklightClient _client = WorklightClient.CreateInstance();
        WorklightAuthorizationManager _wlauthManager = 
                        _client.AuthorizationManager;
        WorklightAccessToken temp1 = await
                         _wlauthManager.ObtainAccessToken("");
        return temp1;
    }
    catch (Exception exception)
    {
        Debug.WriteLine("Exception occured " + exception.Message);
        return null;
    }
}

创建一个新的空白应用程序,并从OnLaunched事件处理程序调用上述函数。

AccessToken = await ConnectMobileFirst();
if (AccessToken != null)
{
    Debug.WriteLine(AccessToken.IsValidToken
        ? "Connection OK, AccessToken is valid"
        : "AccesToken NOT valid");
}

如果可以访问MobileFirst Server,一切都按预期工作,并且AccessToken.IsValidToken为true。

如果MobileFirst Server处于脱机状态,则会发生以下情况:

  • 函数ConnectMobileFirst()完成并返回一个AccessToken对象(方法内部不会发生异常)
  • AccessToken.IsValidToken为false(这是正确的,因为MobileFirst服务器处于脱机状态。)
  • 有时在程序执行Debug.WriteLine语句之前和有时之后,其他线程会遇到NullReferenceException。这个“其他”工作线程在IBMMobileFirstPlatformFoundationWin10.dll内的ObtainAccessToken()调用内部的某个地方启动。 Visual Studio中的“输出”窗口包含以下信息:
  

抛出异常:'System.Runtime.InteropServices.COMException'中   mscorlib.ni.dll WinRT信息:Die Serververbindung konnte nicht   hergestellt werden。

     

抛出异常:'System.Runtime.InteropServices.COMException'中   mscorlib.ni.dll WinRT信息:Die Serververbindung konnte nicht   hergestellt werden。

     

'MFPUnhandledExc1.exe'(CoreCLR:CoreCLR_UWP_Domain):已加载   'd:\ VS2015Projects \ MFPUnhandledExc1 \ BIN \ 86 \调试\ AppX中\ System.Resources.ResourceManager.dll'。   模块没有符号。抛出异常:   System.Net.Http.dll中的“System.Net.Http.HttpRequestException”   抛出异常:'System.Net.Http.HttpRequestException'中   抛出mscorlib.ni.dll异常:   System.Net.Http.dll中的“System.Net.Http.HttpRequestException”   抛出异常:'System.Net.Http.HttpRequestException'中   mscorlib.ni.dll'MFPUnhandledExc1.exe'(CoreCLR:CoreCLR_UWP_Domain):   加载   'd:\ VS2015Projects \ MFPUnhandledExc1 \ BIN \ 86 \调试\ AppX中\ System.Runtime.InteropServices.dll'。   无法找到或打开PDB文件。抛出异常:   mscorlib.ni.dll异常中的“System.Net.Http.HttpRequestException”   抛出:System.Net.Requests.dll异常中的'System.Net.WebException'   抛出:'System.NullReferenceException'中   IBMMobileFirstPlatformFoundationWin10.dll

如果在ConnectMobileFirst()调用之后在行上设置断点,则可以看到有一个工作线程仍处于活动状态,其调用堆栈中包含IBMMobileFirstPlatformFoundationWin10.dll。如果后端连接正常,则此线程不再存在。

此行为不仅可以在MobileFirst Server脱机但服务器响应缓慢或网络速度慢且服务器响应很大时看到。此外,这不仅在连接期间,而且在WorklightResourceRequest.send()期间。

我的问题:

  • 我该怎么做才能防止这个迷路线程杀死我的应用程序? (短期解决方案)
  • 为什么即使对ObtainAccessToken()的调用已经完成,仍然存在工作线程?
  • 为什么这个帖子没有处理它的例外?

3 个答案:

答案 0 :(得分:1)

我们的客户端SDK代码中存在错误。我们已在问题https://www-304.ibm.com/support/entdocview.wss?uid=swg1PI68253中修复了此问题。

修复程序将发布,并将在下一个nuget版本的nuget中提供。

答案 1 :(得分:0)

我该怎么做才能防止这个迷路线程杀死我的应用程序? 看看Application.UnhandledException事件,您可以通过以下链接在MSDN上找到此文档。您可以在App.xaml.cs代码中连接此事件。

  

通常在触发UnhandledException事件后,Windows运行时会终止应用程序,因为该异常未处理。应用程序代码对此有一些控制:如果UnhandledException事件处理程序将事件参数的Handled属性设置为true,那么在大多数情况下,应用程序将不会被终止。

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.unhandledexception

关于您的其他问题,我认为您应该阅读这篇关于 C#或Visual Basic中的Windows运行时应用程序的异常处理 的MSDN文章,这将有所帮助您了解应用中的这些例外情况。

https://msdn.microsoft.com/en-us/library/windows/apps/dn532194

答案 2 :(得分:0)

我们能够重现这个问题,我们正在努力解决这个问题。我们将在发布新版SDK后更新。