如何使用TcpClient类在WCF中获取超时异常

时间:2014-06-30 15:20:37

标签: c# wcf sockets tcp tcpclient

我有一个我面临的问题。我的合同实施(除了其他东西)有类似的东西:

try
            {

                response = _socketRequest.SendRequest(request, emmiterHeader);
                trCode = response.TraceCodeInt;
                if (trCode == 0)
                    statusRequest = (int) TSRequestAttemptStatus.active;
            }
            catch (TimeoutException tex)
            {
                throw;
            }
            catch (Exception)
            {
                statusRequest = (int) TSRequestAttemptStatus.notActive;
                throw;
            }
            finally
            {
                tsra = CreateTireaSincoRequestAttemptRow(DateTime.Now, statusRequest, emmiterHeader.HeaderId,
                                                         string.Empty,
                                                         string.Empty,
                                                         string.Empty,
                                                         previousContractNumber,
                                                         taxIdentificationCode,
                                                         policyHolderName,
                                                         policyHolderFirstName,
                                                         policyHolderLastName,
                                                         registrationNumberType.Substring(0, 1),
                                                         registrationNumber,
                                                         ((byte) ControlCodes.F),
                                                         DateTime.Now.AddDays(emmiterHeader.ValidityPeriod));
            }

然后在

_socketRequest.SendRequest(request,emmiterHeader);

其他内容如下:

using (var client = new TcpClient(header.SocketServerAddress,
                                      header.SocketServerPort == null ? 1 : (int)header.SocketServerPort))
                    {

                   Socket socket = client.Client;

                        // send data with timeout 10s
                        //socket.Send(arr);

                        Send(socket, arr, 0, arr.Length, 1000);

                        if (header.DebugMode)
                            _logger.LogInfo(InterfaceName, string.Format("Data Socket Send: {0} ", tempArr));
                        // receive data with timeout 10s
                        //Receive(client, arr);

                        len = Receive(socket, arrResponse, 0, arrResponse.Length, 5000, header.DebugMode, _logger);

                        if (socket.Connected)
                            socket.Close();

                        if (client.Connected)
                            client.Close();
                    }

使用关键字下的部分永远不会被调用,因为内置在WCF客户端中的是#34;挂起"在TCPClient部分,结论提出了一个SocketExeption错误。我已经在web配置中设置了超时,比如5秒钟。我想要实现的是抛出不是套接字异常但是超时异常。它看起来像抛出了SocketException但我不能让我的wcf服务抛出超时异常。有可能吗?我希望我的任务可以理解我想做什么。如果不是,我会尽可能清楚地解释。

1 个答案:

答案 0 :(得分:0)

TcpClient不知道或不关心您的谈话内容。它没有WCF,Web服务或您想要的TimeoutException概念。

所有这一切都维持着TCP连接。

抓住SocketException并分析存储在其中的错误代码。有一个超时代码。自己抛出TimeoutException


摆脱这种迷信的处置:

                    if (socket.Connected)
                        socket.Close();

                    if (client.Connected)
                        client.Close();

一次就够了。