2009-09-23 51 views
1

我希望我的Silverlight客戶端能夠顯示WCF調用期間發生在服務器上的異常。在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 
} 

在try包裝紙的開始/結束通話{}趕上{}塊似乎並不甚至跳進抓{}塊。

如果重要,我在客戶端使用Silverlight 3。

回答

0

由於瀏覽器沙箱中的安全限制,silverlight無法看到服務器錯誤的主體(狀態碼500)。爲了實現這個功能,您需要對服務器端進行更改,以更改它向瀏覽器返回故障的方式。有一個MSDN article詳細描述它。

+0

非常感謝您的幫助。這解決了它。 雖然,我很擔心web.config中設置要求: \t \t \t \t \t <添加名稱= 「silverlightFaults」 \t \t \t \t \t TYPE =「IWW.MIGTurbo2.WCF.SilverlightFaultBehavior ,IWW.MIGTurbo2.WCF,版本= 2.0.0.429文化=中性公鑰=空「/> \t \t \t 我似乎有具有完整版本=那裏,這是我想避免,如它是動態更新的。有沒有辦法可以忽略這個版本號? – 2009-09-25 16:00:36

+0

我_think_它將仍然綁定沒有全名的類型。如果你拿出版本會發生什麼? – alexdej 2009-09-25 19:39:10

0

你需要做兩件事情:

  • 申報故障異常,因爲合同
  • 的一部分拋出異常的故障異常

    [OperationContract的]

    [FaultContract (typeof(ArithmeticFault))]

    public int Calculate(Operation op,int一個,INT B)

    { // ... }

    擲新的FaultException();

相關問題