WCF 的 Completed 事件中的异常处理
Posted
技术标签:
【中文标题】WCF 的 Completed 事件中的异常处理【英文标题】:Exception Handling in WCF's Completed Event 【发布时间】:2016-05-17 16:26:38 【问题描述】:我想知道如何在我的 WCF's
完成事件方法中捕获异常并在 MessageBox
中将其显示给用户。
我调用了从数据库中获取记录的GetProductTypeAsync();
方法。我想捕获此处发生的任何异常并将其发送到service_GetProductTypeCompleted
事件,它应该向用户显示Exception Message
。
public List<ProductType> GetProductType()
List<ProductType> productType = new List<ProductType>();
try
using (SqlConnection con = new SqlConnection(_connectionString))
SqlCommand cmd = new SqlCommand("usp_Get_ProductType", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
while (reader.Read())
ProductType pType = new ProductType(Convert.ToInt32(reader["pkProductTypeID"]), reader["Name"].ToString());
productType.Add(pType);
catch(Exception ex)
//Catch Exception and send to the service_GetProductTypeCompleted Event Method
return productType;
这里是service_GetProductTypeCompleted
事件
void service_GetProductTypeCompleted(object sender, GetProductTypeCompletedEventArgs e)
if (e.Result.Count != 0)
productTypes = e.Result.ToList();
cboProductType.DataContext = productTypes;
【问题讨论】:
【参考方案1】:当您从您的服务 发送exception
时,客户端将收到一般错误消息:
由于内部错误,服务器无法处理请求。有关该错误的更多信息,请在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪和检查服务器跟踪日志。”
如果您想在客户端捕获特定异常,那么您应该从服务 中抛出所谓的FaultException
。这些是肥皂故障,任何消费者都可以识别。请注意,您的服务使用者并不总是 .NET 使用者,因此无法识别抛出 CLR 异常。这就是为什么你需要throw
Soap exception
。
例如这就是你如何捕捉和抛出Fault Exception
catch (FaultException<AnyTypeThatCanBeSerialized> ex)
throw;
阅读this article了解更多关于wcf Faults
的详细信息
【讨论】:
【参考方案2】:FaultException 不会流向 Silverlight。您需要从服务层返回类似于以下内容的类:
public class ServiceReturnInformation<T>
public T DataContext get; set;
private IList<string> _warnings;
public IList<string> Warnings
get return _warnings ?? (_warnings = new List<string>());
set _warnings = value;
private IList<string> _errors;
public IList<string> Errors
get return _errors ?? (_errors = new List<string>());
set _errors = value;
如果发生异常,您的服务需要捕获异常并设置错误/警告属性。
var result = new ServiceReturnInformation<Employee>();
try
// Do something
result.DataContext = GetEmployee();
catch (Exception ex)
result.DataContext = null;
result.Errors.Add(ex.Message);
return result;
【讨论】:
以上是关于WCF 的 Completed 事件中的异常处理的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过在 Xaml 中调用来自 ViewModel 的命令的方式来处理 Storyboard.Completed 事件