ฉันกำลังดำเนินการบูรณาการกับ Alternative Payments โดยใช้การรวมหน้าที่โฮสต์. C# SDK ของพวกเขาไม่มีการบูรณาการนี้ในขณะนี้ แต่อย่างที่คุณเห็นว่ามันค่อนข้างง่าย และฉันได้จัดชั้นเรียนขนาดเล็กเพื่อส่งคำขอโพสต์และรับการตอบกลับ 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