HttpClient向API发送请求时出现System.IO.IOException:由于远程方关闭了传输流,身份验证失败。

4

我成功地使用VS RestClient插件调用了一个服务(为了保护机密进行了更改)。

POST https://zzz-apis-xyz.com/abc/abc-data/v1/abcbusinessdata HTTP/1.1
X-Special-Client-Id: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
X-Special-Client-Secret: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
accept: application/json 
clientID: cccccc 
content-type: application/json 
abcDistributedKey: ---guid--- 
systemName: chicken

{
    "business": "Hilton",
    "address": "7930 Jones Branch Drive",
    "city": "McLean",
    "state": "VA",
    "postalCode": "22102"
}

我正在尝试使用以下C#代码将此内容发布到api:

var request = new ApiRequest {
  business = "Hilton Hotels",
    address = "7930 Jones Branch Drive",
    city = "McLean",
    state = "VA",
    postalCode = "22102",
};

var requestJson = JsonConvert.SerializeObject(request);

var httpRequestMessage = new HttpRequestMessage {
  Method = HttpMethod.Post,
    RequestUri = new Uri("https://zzz-apis-xyz.com/abc/abc-data/v1/abcbusinessdata"),
    Headers = {
      {
        "X-Special-Client-Id",
        "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
      },
      {
        "X-Special-Client-Secret",
        "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
      },
      {
        "clientID",
        "cccccc"
      },
      {
        "abcDistributedKey",
        Guid.NewGuid().ToString()
      },
      {
        "systemName",
        "GLASS"
      },

    },
    Content = new StringContent(requestJson, Encoding.UTF8, "application/json"),

};

using(var client = new HttpClient(new HttpClientHandler {
  UseDefaultCredentials = true
})) {
  client.BaseAddress = new Uri("https://zzz-apis-xyz.com/");

  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

  try {
    var response = await client.SendAsync(httpRequestMessage);
    var stringResponse = await response.Content.ReadAsStringAsync();

  } catch (Exception e) {
    Console.WriteLine(e);
    throw;
  }
}
}

这段代码两天前可以运行,但今天出现了错误(另一位开发人员也遇到了同样的问题)(注意:vscode和这个C#代码都在同一台机器上运行):

System.Net.Http.HttpRequestException: 发送请求时发生错误。---> System.Net.WebException: 底层连接被关闭:发送时发生意外错误。---> System.IO.IOException: 由于远程方关闭传输流导致身份验证失败。 在 System.Net.TlsStream.EndWrite(IAsyncResult asyncResult) 在 System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) --- 内部异常堆栈跟踪的结尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 ThirdPartyData.WebApi.Tests.ServiceTest.d__1.MoveNext() in ccccccccccccccc :line 128 --- 前一个位置的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)

System.Net.Http.HttpRequestException: 发送请求时发生错误。---> System.Net.WebException: 底层连接被关闭:发送时发生意外错误。---> System.IO.IOException: 由于远程方关闭传输流导致身份验证失败。 在 System.Net.TlsStream.EndWrite(IAsyncResult asyncResult) 在 System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) --- 内部异常堆栈跟踪的结尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()


2
这可能是一个TLS问题,请检查您正在使用哪个版本的TLS。 - Venkata N Bhupathi
1个回答

3

您可能需要强制执行TLS版本,类似于以下内容:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

您可以在此处查找有关SecurityProtocol的更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接