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

本文关键字:超时 异常 WCF 何使用 TcpClient 类在 | 更新日期: 2023-09-27 18:10:45

我有一个我面临的问题。我的合约实现(除了其他东西)是这样的:

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(请求,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();
                    }

using关键字下的部分永远不会被调用,因为内置的WCF客户端在TCPClient部分上"挂起",这最终会引发SocketExeption错误。我在web配置中设置了超时时间,比如说5秒。我想要实现的不是抛出套接字异常,而是抛出超时异常。它看起来像抛出SocketException,但我不能让我的wcf服务抛出超时异常。这可能吗?我希望我的问题是可以理解的,我想做什么。如果没有,我会尽量解释清楚。

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

TcpClient不知道或不关心您在与什么对话。它没有WCF、web服务或您想要的TimeoutException的概念。

它所做的只是维持一个TCP连接。

捕获SocketException并分析其中存储的错误码。有一个超时代码。你自己把TimeoutException扔了


和摆脱迷信处置的东西:

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

一次就够了