Пользовательское исключение ошибки, вызывающее тайм-аут wcf на клиенте - PullRequest
1 голос
/ 31 марта 2011

Я следовал тому же примеру того, как создать пользовательское исключение ошибки (создав класс 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 Ответ

2 голосов
/ 31 марта 2011

Вы должны использовать Fault Contract для отправки исключений по WCF.

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

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

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