我有一个我面临的问题。我的合同实施(除了其他东西)有类似的东西:
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服务抛出超时异常。有可能吗?我希望我的任务可以理解我想做什么。如果不是,我会尽可能清楚地解释。
答案 0 :(得分:0)
TcpClient不知道或不关心您的谈话内容。它没有WCF,Web服务或您想要的TimeoutException
概念。
所有这一切都维持着TCP连接。
抓住SocketException
并分析存储在其中的错误代码。有一个超时代码。自己抛出TimeoutException
。
摆脱这种迷信的处置:
if (socket.Connected)
socket.Close();
if (client.Connected)
client.Close();
一次就够了。