@@ -10,18 +10,20 @@ public class WebRequest
10
10
{
11
11
private class WebRequestState
12
12
{
13
- public AsyncCallback Callback { get ; private set ; }
13
+ public AsyncCallback Callback { get ; }
14
14
15
- public object OriginalState { get ; private set ; }
15
+ public object OriginalState { get ; }
16
16
17
- public Uri Endpoint { get ; private set ; }
17
+ public Uri Endpoint { get ; }
18
18
19
- public byte [ ] Report { get ; private set ; }
19
+ public byte [ ] Report { get ; }
20
20
21
- public System . Net . WebRequest Request { get ; private set ; }
21
+ public System . Net . WebRequest Request { get ; }
22
22
23
23
public HttpWebResponse Response { get ; set ; }
24
24
25
+ public WebException Exception { get ; set ; }
26
+
25
27
public WebRequestState ( AsyncCallback callback , object state , Uri endpoint , byte [ ] report , System . Net . WebRequest request )
26
28
{
27
29
Callback = callback ;
@@ -34,29 +36,31 @@ public WebRequestState(AsyncCallback callback, object state, Uri endpoint, byte[
34
36
35
37
private class WebRequestAsyncResult : IAsyncResult
36
38
{
37
- public bool IsCompleted { get { return _innerAsyncResult . IsCompleted ; } }
39
+ public bool IsCompleted => InnerAsyncResult . IsCompleted ;
38
40
39
- public WaitHandle AsyncWaitHandle { get { return _innerAsyncResult . AsyncWaitHandle ; } }
41
+ public WaitHandle AsyncWaitHandle => InnerAsyncResult . AsyncWaitHandle ;
40
42
41
43
public object AsyncState => WebRequestState . OriginalState ;
42
44
43
- public bool CompletedSynchronously { get { return _innerAsyncResult . CompletedSynchronously ; } }
45
+ public bool CompletedSynchronously => InnerAsyncResult . CompletedSynchronously ;
44
46
45
- public WebRequestState WebRequestState => _webRequestState ;
47
+ public WebRequestState WebRequestState { get ; }
46
48
47
- private readonly IAsyncResult _innerAsyncResult ;
48
- private readonly WebRequestState _webRequestState ;
49
+ private IAsyncResult InnerAsyncResult { get ; }
49
50
50
51
public WebRequestAsyncResult ( IAsyncResult innerAsyncResult , WebRequestState webRequestState )
51
52
{
52
- _innerAsyncResult = innerAsyncResult ;
53
- _webRequestState = webRequestState ;
53
+ InnerAsyncResult = innerAsyncResult ;
54
+ WebRequestState = webRequestState ;
54
55
}
55
56
}
56
57
57
58
public IAsyncResult BeginSend ( Uri endpoint , IWebProxy proxy , KeyValuePair < string , string > [ ] headers , byte [ ] report , AsyncCallback callback , object state )
58
59
{
59
- var request = System . Net . WebRequest . Create ( endpoint ) ;
60
+ var request = ( HttpWebRequest ) System . Net . WebRequest . Create ( endpoint ) ;
61
+ #if ! NETSTANDARD1_3
62
+ request . KeepAlive = false ;
63
+ #endif
60
64
request . Method = "POST" ;
61
65
request . ContentType = "application/json" ;
62
66
if ( proxy != null )
@@ -80,8 +84,18 @@ public WebResponse EndSend(IAsyncResult asyncResult)
80
84
{
81
85
if ( asyncResult is WebRequestAsyncResult result )
82
86
{
83
- var statusCode = result . WebRequestState . Response . StatusCode ;
84
- return new WebResponse ( statusCode ) ;
87
+ if ( result . WebRequestState . Response != null )
88
+ {
89
+ return new WebResponse ( result . WebRequestState . Response . StatusCode ) ;
90
+ }
91
+
92
+ if ( result . WebRequestState . Exception != null )
93
+ {
94
+ if ( result . WebRequestState . Exception . Response is HttpWebResponse response )
95
+ {
96
+ return new WebResponse ( response . StatusCode ) ;
97
+ }
98
+ }
85
99
}
86
100
87
101
return null ;
@@ -101,7 +115,7 @@ private void ReadCallback(IAsyncResult asynchronousResult)
101
115
}
102
116
catch ( WebException exception )
103
117
{
104
- state . Response = exception . Response as HttpWebResponse ;
118
+ state . Exception = exception ;
105
119
}
106
120
107
121
state . Callback ( new WebRequestAsyncResult ( asynchronousResult , state ) ) ;
@@ -119,7 +133,10 @@ private void WriteCallback(IAsyncResult asynchronousResult)
119
133
}
120
134
catch ( WebException exception )
121
135
{
122
- state . Response = exception . Response as HttpWebResponse ;
136
+ state . Exception = exception ;
137
+ // call the original callback as we cannot continue sending the report
138
+ state . Callback ( new WebRequestAsyncResult ( asynchronousResult , state ) ) ;
139
+ return ;
123
140
}
124
141
125
142
state . Request . BeginGetResponse ( new AsyncCallback ( ReadCallback ) , state ) ;
@@ -128,13 +145,11 @@ private void WriteCallback(IAsyncResult asynchronousResult)
128
145
129
146
public class WebResponse
130
147
{
131
- private readonly HttpStatusCode _httpStatusCode ;
148
+ public HttpStatusCode HttpStatusCode { get ; }
132
149
133
150
public WebResponse ( HttpStatusCode httpStatusCode )
134
151
{
135
- _httpStatusCode = httpStatusCode ;
152
+ HttpStatusCode = httpStatusCode ;
136
153
}
137
-
138
- public HttpStatusCode HttpStatusCode => _httpStatusCode ;
139
154
}
140
155
}
0 commit comments