Skip to content

Commit 35470d5

Browse files
committed
增加请求超时支持
1 parent 4e27501 commit 35470d5

File tree

2 files changed

+82
-41
lines changed

2 files changed

+82
-41
lines changed

WebApiClient/Internal/SocketExtend.cs

Lines changed: 81 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -28,39 +28,72 @@ public static async Task ConnectTaskAsync(this Socket socket, EndPoint remoteEnd
2828
throw new ArgumentNullException(nameof(remoteEndPoint));
2929
}
3030

31-
var taskSetter = new TaskSetter<object>(timeout);
32-
var asyncEventArg = new SocketAsyncEventArgs
31+
var token = new UserToken<object>
3332
{
34-
UserToken = taskSetter,
35-
RemoteEndPoint = remoteEndPoint
33+
Socket = socket,
34+
TaskSetter = new TaskSetter<object>(timeout)
3635
};
3736

38-
asyncEventArg.Completed += ConnectCompleted;
39-
40-
if (socket.ConnectAsync(asyncEventArg) == false)
41-
{
42-
ConnectCompleted(socket, asyncEventArg);
43-
}
37+
socket.BeginConnect(remoteEndPoint, OnEndConnect, token);
38+
await token.TaskSetter.Task;
39+
}
4440

41+
/// <summary>
42+
/// 连接完成
43+
/// </summary>
44+
/// <param name="ar"></param>
45+
private static void OnEndConnect(IAsyncResult ar)
46+
{
47+
var token = ar.AsyncState as UserToken<object>;
4548
try
4649
{
47-
await taskSetter.Task;
50+
token.Socket.EndConnect(ar);
51+
token.TaskSetter.SetResult(null);
4852
}
49-
finally
53+
catch (Exception ex)
5054
{
51-
asyncEventArg.Dispose();
55+
token.TaskSetter.SetException(ex);
5256
}
5357
}
5458

59+
5560
/// <summary>
56-
/// 连接完成
61+
/// 异步发送
62+
/// </summary>
63+
/// <param name="socket"></param>
64+
/// <param name="arraySegment">缓冲区</param>
65+
/// <param name="timeout">等待数据的超时时间</param>
66+
/// <exception cref="SocketException"></exception>
67+
/// <exception cref="TimeoutException"></exception>
68+
/// <returns></returns>
69+
public static async Task<int> SendTaskAsync(this Socket socket, ArraySegment<byte> arraySegment, TimeSpan? timeout)
70+
{
71+
var token = new UserToken<int>
72+
{
73+
Socket = socket,
74+
TaskSetter = new TaskSetter<int>(timeout)
75+
};
76+
77+
socket.BeginSend(arraySegment.Array, arraySegment.Offset, arraySegment.Count, SocketFlags.None, OnEndSend, token);
78+
return await token.TaskSetter.Task;
79+
}
80+
81+
/// <summary>
82+
/// 发送完成
5783
/// </summary>
58-
/// <param name="sender"></param>
59-
/// <param name="e"></param>
60-
private static void ConnectCompleted(object sender, SocketAsyncEventArgs e)
84+
/// <param name="ar"></param>
85+
private static void OnEndSend(IAsyncResult ar)
6186
{
62-
var taskSetter = e.UserToken as TaskSetter<object>;
63-
taskSetter.SetResult(null);
87+
var token = ar.AsyncState as UserToken<int>;
88+
try
89+
{
90+
var length = token.Socket.EndSend(ar);
91+
token.TaskSetter.SetResult(length);
92+
}
93+
catch (Exception ex)
94+
{
95+
token.TaskSetter.SetException(ex);
96+
}
6497
}
6598

6699
/// <summary>
@@ -74,39 +107,48 @@ private static void ConnectCompleted(object sender, SocketAsyncEventArgs e)
74107
/// <returns></returns>
75108
public static async Task<int> ReceiveTaskAsync(this Socket socket, ArraySegment<byte> arraySegment, TimeSpan? timeout)
76109
{
77-
var taskSetter = new TaskSetter<int>(timeout);
78-
var asyncEventArg = new SocketAsyncEventArgs
110+
var token = new UserToken<int>
79111
{
80-
UserToken = taskSetter
112+
Socket = socket,
113+
TaskSetter = new TaskSetter<int>(timeout)
81114
};
115+
socket.BeginReceive(arraySegment.Array, arraySegment.Offset, arraySegment.Count, SocketFlags.None, OnEndReceive, token);
116+
return await token.TaskSetter.Task;
117+
}
82118

83-
asyncEventArg.SetBuffer(arraySegment.Array, arraySegment.Offset, arraySegment.Count);
84-
asyncEventArg.Completed += ReceiveCompleted;
85-
86-
if (socket.ReceiveAsync(asyncEventArg) == false)
87-
{
88-
ReceiveCompleted(socket, asyncEventArg);
89-
}
90-
119+
/// <summary>
120+
/// 接收完成
121+
/// </summary>
122+
/// <param name="ar"></param>
123+
private static void OnEndReceive(IAsyncResult ar)
124+
{
125+
var token = ar.AsyncState as UserToken<int>;
91126
try
92127
{
93-
return await taskSetter.Task;
128+
var length = token.Socket.EndReceive(ar);
129+
token.TaskSetter.SetResult(length);
94130
}
95-
finally
131+
catch (Exception ex)
96132
{
97-
asyncEventArg.Dispose();
133+
token.TaskSetter.SetException(ex);
98134
}
99135
}
100136

101137
/// <summary>
102-
/// 接收完成
138+
/// 表示用户信息
103139
/// </summary>
104-
/// <param name="sender"></param>
105-
/// <param name="e"></param>
106-
private static void ReceiveCompleted(object sender, SocketAsyncEventArgs e)
140+
/// <typeparam name="T"></typeparam>
141+
private class UserToken<T>
107142
{
108-
var taskSetter = e.UserToken as TaskSetter<int>;
109-
taskSetter.SetResult(e.BytesTransferred);
143+
/// <summary>
144+
/// socket
145+
/// </summary>
146+
public Socket Socket { get; set; }
147+
148+
/// <summary>
149+
/// 任务
150+
/// </summary>
151+
public TaskSetter<T> TaskSetter { get; set; }
110152
}
111153

112154
/// <summary>

WebApiClient/ProxyValidator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ public static async Task<HttpStatusCode> ValidateAsync(IWebProxy webProxy, Uri t
143143

144144
var request = httpProxy.ToTunnelRequestString(targetAddress);
145145
var sendBuffer = Encoding.ASCII.GetBytes(request);
146-
var sendArraySegment = new List<ArraySegment<byte>> { new ArraySegment<byte>(sendBuffer) };
147-
await Task.Factory.FromAsync(socket.BeginSend, socket.EndSend, sendArraySegment, SocketFlags.None, null);
146+
await socket.SendTaskAsync(new ArraySegment<byte>(sendBuffer), timeout);
148147

149148
var recvBufferSegment = new ArraySegment<byte>(new byte[150]);
150149
var length = await socket.ReceiveTaskAsync(recvBufferSegment, timeout);

0 commit comments

Comments
 (0)