.NET MAUI中System.Net.WebException: Connection reset错误求助
问题排查:本地IIS发布API后出现Connection Reset错误
问题背景
在JSON模型中使用JsonCryption.Encryption和JsonCryption.Decryption加密算法,此前将API发布至Windows服务器测试时运行正常。服务器关闭后,通过本地IIS绑定域名重新发布API,当前客户端(Xamarin.Android)无法发送请求,抛出Connection Reset错误;此前Visual Studio本地运行API时也存在异常。
错误日志
{System.Net.WebException: Connection reset ---> Java.Net.SocketException: Connection reset at Java.Interop.JniEnvironment.InstanceMethods.CallIntMethod(JniObjectReference instance, JniMethodInfo method, JniArgumentValue* args) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net7.0/JniEnvironment.g.cs:line 11725 at Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualInt32Method(String encodedMember, IJavaPeerable self, JniArgumentValue* parameters) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:line 511 at Java.Net.HttpURLConnection.get_ResponseCode() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net7.0/android-33/mcw/Java.Net.HttpURLConnection.cs:line 511 at Xamarin.Android.Net.AndroidMessageHandler.<>c__DisplayClass132_0.<DoProcessRequest>b__2() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 577 at System.Threading.Tasks.Task`1[[System.Net.HttpStatusCode, System.Net.Primitives, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].InnerInvoke() at System.Threading.Tasks.Task.<>c.<.cctor>b__273_0(Object obj) at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location --- at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) --- End of stack trace from previous location --- at Xamarin.Android.Net.AndroidMessageHandler.DoProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 577 at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 417 --- End of managed Java.Net.SocketException stack trace --- java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:215) at java.net.SocketInputStream.read(SocketInputStream.java:144) at com.android.okhttp.okio.Okio$2.read(Okio.java:138) at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:307) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:301) at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:197) at com.android.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:188) at com.android.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:129) at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:750) at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:622) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) --- End of managed Java.Net.SocketException stack trace --- java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:215) at java.net.SocketInputStream.read(SocketInputStream.java:144) at com.android.okhttp.okio.Okio$2.read(Okio.java:138) at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:307) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:301) at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:197) at com.android.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:188) at com.android.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:129) at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:750) at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:622) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) --- End of inner exception stack trace --- at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs:line 431 at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at Kuber.UI.Services.HttpClientService.<SendAsync>d__2`1[[System.String, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() in C:\Github\Kuber.UI\Kuber.UI\Services\Concrete\HttpClientService.cs:line 32}
客户端请求代码
public async Task<ResponseModel<TEntity>> SendAsync<TEntity>(HttpMethod method, string requestUri, object content) { try { var url = new Uri(App.KuberURL + requestUri); var request = new RequestModel { model = JsonCryption.Encryption(JsonConvert.SerializeObject(content)) }; var cryptionContent = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url); httpRequestMessage.Content = cryptionContent; var response = await _httpClient.SendAsync(httpRequestMessage); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); var responseModel = JsonConvert.DeserializeObject<ResponseModel<TEntity>>(JsonCryption.Decryption(json)); return responseModel; } catch(TimeoutException ex) { return null; } catch (WebException ex) { return null; } catch (Exception ex) { return null; //throw new Exception(); } } public class ResponseModel<TEntity> { public TEntity Value { get; set; } public int ErrorCode { get; set; } public string ErrorMessage { get; set; } }
排查方向与解决思路
网络连通性验证
- 在客户端设备上用浏览器直接访问API绑定的域名,确认是否能正常获取响应(比如Swagger页面),排除DNS解析或路由问题。
- 检查本地防火墙是否开放了API绑定的端口,同时确认端口未被其他程序占用。
- 若使用HTTPS,需确保安卓设备信任本地IIS的SSL证书(自签证书需手动安装到设备信任列表)。
IIS配置检查
- 确认IIS应用程序池的.NET版本与API的目标框架匹配(比如API为.NET 7,应用程序池需对应选择.NET 7或无托管代码)。
- 检查站点绑定的主机头、端口与客户端请求的地址完全一致,避免因绑定规则不匹配导致请求被拒绝。
- 查看IIS日志(默认路径
C:\inetpub\logs\LogFiles),确认请求是否到达服务器,以及服务器返回的具体状态码。
加密逻辑隔离测试
- 临时注释掉
JsonCryption加密/解密代码,发送明文请求,验证是否能正常通信,排除加密逻辑导致的请求格式错误。 - 检查加密后的内容是否包含特殊字符,导致请求体不符合
application/json规范,可对加密结果进行URL编码后再封装到请求体。
- 临时注释掉
HttpClient配置优化
- 确认
App.KuberURL的域名、端口拼写正确,无多余路径或字符。 - 调整HttpClient的超时时间,避免因服务器处理缓慢导致连接被重置。
- 尝试将Xamarin.Android的
AndroidMessageHandler替换为HttpClientHandler,排查是否为安卓系统网络处理组件的问题。
- 确认
服务器端日志补充
- 在API中添加详细日志,记录请求到达时间、请求体内容、解密过程、异常信息,确认服务器是否接收并处理了请求,以及处理过程中是否出现未捕获的异常。
内容的提问来源于stack exchange,提问作者Mustafa Gönültaş
相关产品推荐
相关产品推荐

