关于Silverlight调用WCF/Rest的异常
新建Rest服务接口:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}接着新建一个服务实现类:public class Service1 : IService1
{
public string GetData(int value)
{
int i = 0;
int j = 5 / i;
return string.Format("You entered: {0}", value);
}
}在这里让Service1 抛出”divided by zero exception:”
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceBehavior" name="WcfService1.Service1">
</service>
</services>
</system.serviceModel>在这里注意<serviceDebug includeExceptionDetailInFaults="true" />
在Silverlight 客户端添加服务引用,名称为:ServiceReference1.
在页面上添加一个按钮,按钮的Click事件代码如下:
private void Button_Click(object sender, RoutedEventArgs e)
{
Service1Client client = new ServiceReference1.Service1Client();client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(client_GetDataCompleted);
client.GetDataAsync(35); //Try GetData
}void client_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
}运行,结果如下:
可以看到实际的异常是“尝试除以0”,但是由于浏览器限制,所有的异常都是NotFound。
在msdn上有两种方法可以解决这个问题,
最简单的就是在App.xaml.cs代码里面使用RegisterPrefix来使用备用客户端 HTTP 堆栈
public App()
{
bool bRegisterPrefix = WebRequest.RegisterPrefix(http://localhost:9541/, WebRequestCreator.ClientHttp);
//other Code
}再次运行代码:
这是SL调用WCF服务如何处理异常的方式,那么调用Rest服务呢?
首先要修改Web.config 节点下的serviceModel以让它支持Rest。
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="EndpointBehavior">
<webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"
faultExceptionEnabled="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceBehavior" name="WcfService1.Service1">
<endpoint behaviorConfiguration="EndpointBehavior" binding="webHttpBinding"
bindingConfiguration="" name="Rest" contract="WcfService1.IService1" />
</service>
</services>
</system.serviceModel>
在这里要设置webHttp 节点的faultExceptionEnabled=true.并且设置serviceDebug 的includeExceptionDetailInFaults 为true。
OK,服务的Web.config文件已经配置完毕了,接下来要为GetData方法添加WebGet特性修饰了。
public class Service1 : IService1
{
[WebGet()]
public string GetData(int value)
{
int i = 0;
int j = 5 / i;return string.Format("You entered: {0}", value);
}
}运行:
可以看到得到了异常信息了。
注意:别忘记了添加跨域和授权文件:crossdomain.xml 和 clientaccesspolicy.xml 到网站根目录。
同样,修改SL客户端页面,添加一个Button,button的代码事件为:
private void btnRest_Click(object sender, RoutedEventArgs e)
{
WebClient wc = new WebClient();wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
}void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
&n
补充:软件开发 , C# ,