You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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ş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:05:42