1

我希望我的 Silverlight 客户端能够显示 WCF 调用期间服务器上发生的异常。

鉴于我当前创建 WCF 通道的代码(在客户端上):

// create the binding elements
BinaryMessageEncodingBindingElement binaryMessageEncoding = new BinaryMessageEncodingBindingElement();
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue };

// add the binding elements into a Custom Binding
CustomBinding customBinding = new CustomBinding(binaryMessageEncoding, httpTransport);

// create the Endpoint URL 
EndpointAddress endpointAddress = new EndpointAddress(serviceUrl);

            // create an interface for the WCF service
ChannelFactory<TWcfApiEndPoint> channelFactory=new ChannelFactory<TWcfApiEndPoint>(customBinding, endpointAddress);
channelFactory.Faulted += new EventHandler(channelFactory_Faulted);         
TWcfApiEndPoint client = channelFactory.CreateChannel();

return client;

当发生异常时,我只是得到一个“NotFound”异常,这显然是没有用的。如何获取异常信息?

我使用此代码来使用上面返回的客户端对象:

try
{
// customFieldsBroker is the client returned above
        customFieldsBroker.BeginCreateCustomField(DataTypeID, newCustomField, (result) =>
        {
            var response = ((ICustomFieldsBroker)result.AsyncState).EndCreateCustomField(result);

    }, customFieldsBroker);
}
catch (Exception ex)
{
    // would like to handle exception here
}

将 Begin/End 调用包装在 try { } catch { } 块中似乎甚至不会跳入 catch { } 块。

如果重要的话,我在客户端使用 Silverlight 3。

4

2 回答 2

0

由于浏览器沙箱中的安全限制,silverlight 无法看到服务器错误的正文(状态码 500)。要使其正常工作,您需要对服务器端进行更改,以更改它向浏览器返回故障的方式。有一篇MSDN 文章详细描述了它。

于 2009-09-24T17:11:14.027 回答
0

你需要做两件事:

  • 将故障例外声明为合同的一部分
  • 将异常作为故障异常抛出

    [运营合同]

    [FaultContract(typeof(ArithmeticFault))]

    公共 int 计算(操作 op,int a,int b)

    { // ... }

    抛出新的故障异常();

于 2009-09-24T17:20:24.290 回答