我已经启用了支持Silverlight的WCF Web服务,并且我从Silverlight应用程序连接到它。
不使用ASync模式编写服务,但Silverlight会自动生成异步方法。
我有一个方法,在我的服务中有可能抛出异常我可以捕获此异常,但我不确定处理此异常的最佳方法,我注意到已完成的事件args方法包含错误属性。
是否可以设置此错误属性的值?
示例方法
public class service
{
[OperationContract]
public Stream getData(string filename)
{
string filepath = HostingEnvironment.MapPath(filename);
FileInfo fi = new FileInfo(filenpath);
try
{
Stream s = fi.Open(FileMode.Open);
return s;
}
catch (IOException e)
{
return null;
}
}
}
Silverlight代码
btnFoo_Click(object sender, RoutedEventArgs e)
{
ServiceClient svc = new ServiceClient();
svc.getDataCompleted += new EventHandler<getDataCompletedEventArgs>(getData_Completed);
svc.getDataAsync("text.txt");
}
void getData_Completed(object sender, getDataCompletedEventArgs e)
{
e.Error //how can i set this value on the service?
}
最后,如果服务处于脱机状态或者超时,那么在它到达App.xaml中的UnhandledException方法之前是否仍然会捕获此异常?
由于
答案 0 :(得分:2)
由于silverlight正在异步使用服务,因此您不会获得同步异常抛出,而是将其存储在e.Error
属性中,您需要检入ServiceCallCompleted
方法。
回答你的问题
如何在服务上设置此值?
只需在服务器上抛出异常,在其他几个条件下它就足够了。
您可能希望在WCF服务方法上引入FaultContract,并抛出FaultException<T>
这是处理WCF中的错误的常用方法。
但是,返回代码500和silverlight的错误结果将无法获得具有此类状态代码的响应并且无法访问Fault对象,即使您将该属性添加到服务中也是如此。
这可以通过几种方法解决。
答案 1 :(得分:-2)
Creating and Handling Faults in Silverlight
OR
[DataContract]
public class MyError
{
[DataMember]
public string Code { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public DateTime Time { get; set; }
}
public class service
{
[OperationContract]
public Stream getData(string filename, out MyError myError)
{
myError = null;
string filepath = HostingEnvironment.MapPath(filename);
FileInfo fi = new FileInfo(filenpath);
try
{
Stream s = fi.Open(FileMode.Open);
return s;
}
catch (IOException e)
{
myError = new MyError() { Code = "000", Message = ex.Message, Time = DateTime.Now };
return null;
}
}
}
我希望成功的项目