C# HttpClient 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.
호스팅된 페이지 통합을 사용하여 대체 결제와의 통합을 추진하고 있습니다.현재 C# SDK에는 이 통합이 없습니다만, 보다시피 심플하고, 투고 요구를 송신해, JSON 응답을 얻기 위해서 작은 클래스를 만들었습니다.
PostMan과 cURL에서 보내는 json 오브젝트를 테스트했고, 둘 다 인증 헤더로 동작하기 때문에 문제가 없다고 생각합니다.다음은 우리 클래스의 작성자입니다.
public AlternativePaymentsCli(string apiSecretKey)
{
this._apiSecretKey = apiSecretKey;
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var authInfo = _apiSecretKey;
authInfo = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:", _apiSecretKey)));
// The two line below because I saw in an answer on stackoverflow.
_httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
_httpClient.DefaultRequestHeaders.Add("Keep-Alive", "3600");
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Anything.com custom client v1.0");
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authInfo);
}
그리고 데이터를 게시하는 방법:
public string CreateHostedPageTransaction(HostedPageRequest req)
{
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
// I send this same json content on PostMan and it works. The json is not the problem
var content = new StringContent(JsonConvert.SerializeObject(req, settings), Encoding.UTF8, "application/json");
var response = _httpClient.PostAsync(this._baseUrl + "/transactions/hosted", content).Result;
var responseText = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
if (response.IsSuccessStatusCode)
return responseText;
return "";
}
그러면 다음 오류가 나타납니다.An existing connection was forcibly closed by the remote host, PostAsync 행에 있습니다.에러의 상세를 다음에 나타냅니다.
[SocketException (0x2746): An existing connection was forcibly closed by the remote host]
System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) +8192811
System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) +47
[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
System.Net.TlsStream.EndWrite(IAsyncResult asyncResult) +294
System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) +149
[WebException: The underlying connection was closed: An unexpected error occurred on a send.]
System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) +324
System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) +137
[HttpRequestException: An error occurred while sending the request.]
C# 4.5, ASP를 사용하고 있습니다.넷 MVC같은 오류에 대한 답을 읽어봤지만 지금까지 내 문제를 해결한 게 하나도 없어요.이 코드에 없는 게 뭐죠?
도와주셔서 감사합니다.
코드 샘플에는 _baseUrl의 값을 설정하고 있는 장소가 표시되어 있지 않습니다만, 아마 어딘가에 있을 것입니다.또, 이것은 지불에 관련하고 있기 때문에, URL은 HTTPS라고 생각됩니다.리모트 호스트가 TLS 1.0을 무효로 하고 있고, 접속이 TLS 1.0으로 착신하고 있는 경우는, 그러한 동작이 발생할 가능성이 있습니다.C# 4.6은 디폴트로 TLS 1.0/1.1/1.2를 지원하고 있습니다만, 디폴트로는 TLS 1.1 및 1.2가 서포트되고 있어도, C# 4.6은 여전히 SSL3/TLS 1.0만을 디폴트로 하고 있다고 생각합니다.이것이 문제의 원인인 경우 다음 코드를 사용하여 TLS 1.1 및 1.2를 사용하도록 설정된 값에 수동으로 추가할 수 있습니다.
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
를 사용하고 있는 경우.Net 4.0을 사용한 후 Security Protocol Type을 사용합니다.Tls11 및 SecurityProtocolType.TLS2는 정의되어 있지 않기 때문에 대신 아래의 하드코드 값을 사용할 수 있습니다.
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
유사한 질문에 대한 이 훌륭한 답변에서 설명한 바와 같이 코드를 변경하지 않고 문제를 해결할 수 있습니다.
웹 프로젝트의 대상을 로 변경합니다.Net 4.6+ 를 사용하고, 다음과 같이 web.config 를 갱신합니다.
<system.web>
<compilation targetFramework="4.6" />
<httpRuntime targetFramework="4.6" />
</system.web>
난 이게 효과가 있었어 첫 번째 행은 프로토콜을 보장해ssl3그리고.TLS1.2두 번째 행은 잠재적인 증명서 오류(유효기간이 지난 증명서 등)를 모두 무시합니다.:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
이 에러는 프록시 서버의 설정을 잊어버린 것이 원인입니다.다음 코드를 사용하여 다음을 구성합니다.HttpClient응용 프로그램:NET 4.7.2:
var httpClientHandler = new HttpClientHandler { Proxy = WebRequest.GetSystemWebProxy() };
var httpClient = new HttpClient(httpClientHandler);
이게 도움이 됐으면 좋겠네요.
언급URL : https://stackoverflow.com/questions/46223078/c-sharp-httpclient-an-existing-connection-was-forcibly-closed-by-the-remote-host
'programing' 카테고리의 다른 글
| jAJAX 스트림을 증분적으로 읽으시겠습니까? (0) | 2023.03.01 |
|---|---|
| Oracle '파티션 기준' 및 'Row_Number' 키워드 (0) | 2023.03.01 |
| T-SQL에서처럼 PL/SQL에서 변수를 선언하고 사용하는 방법은 무엇입니까? (0) | 2023.03.01 |
| woocommerce 위젯 "속성별로 제품 필터링"에 사용할 수 없는 제품이 표시됨 (0) | 2023.03.01 |
| 여러 파라미터를 사용하는 AngularJS $broadcast (0) | 2023.03.01 |