Пользовательское исключение ошибки, вызывающее тайм-аут wcf на клиенте
Я последовал тому же примеру о том, как создать пользовательское исключение ошибки (создав класс Exception и сославшись на него в FaultContract), однако каждый раз, когда я пытаюсь вызвать исключение с сервера, я получаю тайм-аут соединения от клиента и связь самая близкая. Странная вещь, если я использую класс FaultException по умолчанию для выдачи ошибки с сервера, тогда клиент получит ее правильно.
вот фрагмент:
[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();
Любая идея, почему я получаю тайм-аут подключения, только когда я использую пользовательское исключение?
Большое спасибо.
1 ответ
Вы должны использовать Fault Contract для отправки исключений через WCF.
http://msdn.microsoft.com/en-us/library/ms733721.aspx
Вы можете создавать собственные исключения ошибок
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);