• 当应用程序不是以UserInteractive 模式运行时显示模式对话框或窗体


    最近在做一个WCF程序的时候,WCF程序老是弹出一个错误“当应用程序不是以UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定ServiceNotification或DefaultDesktopOnly样式,以显示服务应用程序发出的通知”这个错误的警告,后来通过try catch语句来捕获到了这个错误,并找到了一些提示信息。

    很可能由 IncludeExceptionDetailInFaults=true 创建的 ExceptionDetail,其值为:
    System.InvalidOperationException: 当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。
    在 System.Windows.Forms.MessageBox.ShowCore(IWin32Window owner, String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, Boolean showHelp)
    在 System.Windows.Forms.MessageBox.Show(String text)
    在 DataProvider.Utils.SQLServerHelper.Open() 位置 c:Users2457Desktop宁波市公路局DataProvider(2015-10-26-最终版)UtilsDataBaseSQLServerHelper.cs:行号 33
    在 DataProvider.Utils.SQLServerHelper..ctor(String connectStr) 位置 c:Users2457Desktop宁波市公路局DataProvider(2015-10-26-最终版)UtilsDataBaseSQLServerHelper.cs:行号 21
    在 DataProvider.Announcement..ctor() 位置 c:Users2457Desktop宁波市公路局DataProvider(2015-10-26-最终版)Announcement.cs:行号 21
    在 CreateDataProvider.Announcement()
    在 System.ServiceModel.Dispatcher.InstanceProvider.GetInstance(InstanceContext instanceContext, Message message)
    在 System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance(InstanceContext instanceContext, Message request)
    在 System.ServiceModel.InstanceContext.GetServiceInstance(Message message)
    在 System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
    在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)}

        看到这些堆栈的调用信息之后,System.Windows.Forms.MessageBox.ShowCore这个是问题的核心,也就是在WCF程序中是不能出现窗体的相关代码,比如MessageBox、OpenFileDialog等相关代码,如果出现这些信息,程序就会经常出现这个错误,应为我们的WCF程序是部署在IIS上面的,IIS是不允许这样处理的。然后再看看我们的代码。

    private void Open()
    {
      try
      {
        sqlConn.Open();//打开数据库
      }
      catch (Exception ex)
      {
        //MessageBox.Show(ex.Message);
      }
    }

    然后去掉整个程序中出现的MessageBox就可以了。通过这个BUG至少可以得出两点结论:

       1  必须学会使用try catch去捕获未知的错误,然后去查找相关的堆栈信息,然后一步步根据提示来解决问题。

       2  WCF程序中必须不能使用任何和窗体相关的类或者代码。

  • 相关阅读:
    第六周学习总结
    20165227 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
    第五周学习总结
    20165227 20165228结对学习感想
    第四周课堂测试补做
    第四周作业
    20165227第三周学习总结
    第二周学习总结
    20165304《JAVA程序设计》第四周学习总结
    20165304 2017-2018-2 《Java程序设计》第3周学习总结
  • 原文地址:https://www.cnblogs.com/seekdream/p/5295559.html
Copyright © 2020-2023  润新知