2011-03-31 3 views
1

Я выполнил тот же пример, как создать настраиваемое исключение сбоя (путем создания класса исключения и ссылки на него в FaultContract), однако каждый раз, когда я пытаюсь исключить исключение из сервер, я получаю таймаут соединения от клиента, и соединение ближе всего. Странная вещь, если я использую класс FaultException по умолчанию, чтобы выбросить ошибку с сервера, тогда клиент получит ее правильно.Пользовательское исключение сбоя, вызывающее тайм-аут wcf на клиенте

вот фрагмент:

[DataContract(Namespace = "http://MyApp.Common", Name = "WcfException")] 
public class WcfException 
{ 
    private string methodName; 
    private string nameSpace; 
    private string errorDescription; 
    private string stackTrace; 
    private System.Exception exCeption; 

    public WcfException() 
    { 
     methodName = String.Empty; 
     nameSpace = String.Empty; 
     errorDescription = String.Empty; 
     stackTrace = String.Empty; 
     exCeption = null; 
    } 

    [DataMember] 
    public System.Exception MethodException 
    { 
     get 
     { 
      return exCeption; 
     } 
     set 
     { 
      exCeption = value; 
      errorDescription = exCeption.Message; 
      stackTrace = exCeption.StackTrace; 
     } 
    } // and so on.... 

Я инициализировать сервер, как это:

   Type serviceType = typeof(Proxy); 
       Uri baseUri = new Uri(@"net.tcp://" + Environment.MachineName + ":8030/"); 
       NetTcpBinding Binding = new NetTcpBinding(); 
       serviceHost = new ServiceHost(serviceType, baseUri); 

       ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 
       serviceHost.Description.Behaviors.Add(behavior); 

       ServiceDebugBehavior sdb = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
       sdb.IncludeExceptionDetailInFaults = true; 

       Binding.Name = "ConfigurationHttpChannel"; 
       Binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 
       Binding.Security.Mode = SecurityMode.None; 
       Binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
       Binding.SendTimeout = new TimeSpan(0, 10, 0); 
       Binding.OpenTimeout = new TimeSpan(0, 10, 0); 
       Binding.CloseTimeout = new TimeSpan(0, 10, 0); 
       Binding.MaxReceivedMessageSize = 65536; 
       Binding.MaxBufferSize = 65536; 
       Binding.MaxBufferPoolSize = 524288; 
       Binding.TransferMode = TransferMode.Buffered; 

       serviceHost.AddServiceEndpoint(typeof(IProxy), Binding, "MyApi"); 
       serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), Binding, "mex"); 

       serviceHost.Open(); 

Любая идея, почему я получаю тайм-аут соединения только когда я использовать специальное исключение?

Большое спасибо.

+0

Поместите свой '' ServiceContract' и OperationContract' – Aliostad

ответ

2

Вы должны использовать Контракт об ошибке, чтобы отправлять исключения по WCF.

http://msdn.microsoft.com/en-us/library/ms733721.aspx

Вы можете создавать собственные вина Исключения

[OperationContract] 
[FaultContract(typeof(MathFault))] 
int Divide(int n1, int n2);