如何使用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、web服务或您想要的TimeoutException
的概念。
它所做的只是维持一个TCP连接。
捕获SocketException
并分析其中存储的错误码。有一个超时代码。你自己把TimeoutException
扔了
和摆脱迷信处置的东西:
if (socket.Connected)
socket.Close();
if (client.Connected)
client.Close();
一次就够了