最近在做一個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:\Users\2457\Desktop\寧波市公路局\DataProvider(2015-10-26-最終版)\Utils\DataBaseSQLServerHelper.cs:行號 33
在 DataProvider.Utils.SQLServerHelper..ctor(String connectStr) 位置 c:\Users\2457\Desktop\寧波市公路局\DataProvider(2015-10-26-最終版)\Utils\DataBaseSQLServerHelper.cs:行號 21
在 DataProvider.Announcement..ctor() 位置 c:\Users\2457\Desktop\寧波市公路局\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程序中必須不能使用任何和窗體相關的類或者代碼。