Я работаю над интеграцией с альтернативными платежами, используя их интеграцию с размещенной страницей. В их SDK C # эта интеграция пока недоступна, но, как вы можете видеть, это довольно просто, и я создал небольшой класс для отправки почтового запроса и получения ответа JSON.
Я протестировал объект json, который отправляю на PostMan и cURL, и оба работают, а также заголовок аутентификации, поэтому я думаю, что это не проблема. Вот конструктор моего класса:
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.Net MVC. Я читал ответы на ту же ошибку, и пока никто из них не решил мою проблему. Что мне не хватает в этом коде?
Спасибо за любую помощь
var
во всем заставит ваших коллег ненавидеть вас. Используйтеvar
только тогда, когда тип очевиден (т.е.var date = new DateTime();
) его очень явноDateTime
. Однакоvar response = _httpClient.PostAsync(this._baseUrl + "/transactions/hosted", content).Result;
неясно, потому что.Result
- это свойство, а не подразумевается, какой это тип. - person maccettura   schedule 14.09.2017var
делает код намного чище. Нет никакой двусмысленности в том, что это за тип, если вы не пишете действительно длинные методы, и в этом случае вам действительно нужно разбивать их на части. Коллеги возненавидят вас, если вы напишете такие длинные методы, что они не смогут понять, что это за типы. - person Panagiotis Kanavos   schedule 14.09.2017var
делает код чище только тогда, когда тип подразумевается, использованиеvar
везде (даже в тех случаях, когда тип не подразумевается) просто плохое программирование. - person maccettura   schedule 14.09.2017.Result
, коллеги будут ненавидеть любого, кто блокирует асинхронный вызов с помощью.Wait()
или.Result
. Тип возврата все равно известен. Это HttpResponseMessage. Увидеть имя вам не поможет, так как вам все равно придется использовать intellisense, чтобы найти, какие методы использовать. - person Panagiotis Kanavos   schedule 14.09.2017.Result
должен вызвать раздражение у кого угодно. - person Panagiotis Kanavos   schedule 14.09.2017