C# SocketException: 你的主机中的软件中止了一个已建立的连接。记录

昨晚向同事写的python接口post图像数据的时候,出现了这个提示,但一次链接是没有这种问题的(StutasCode提示为400),但第二次发送的时候,就提示:SocketException: 你的主机中的软件中止了一个已建立的连接。

开始以为是接口写的由问题,但是同事的python脚本却能够正常上传。后面测试发现,原来是与服务器接口的数据要求格式不同,经过修改代码后,能够正确发送。
##附上python的post的方式

    files = {'img': (CAPTCHA_NAME, open(img_path, 'rb'), 'image/png', {})}
    res = requests.post('http://0.0.0.0:1000/Test', files=files,timeout=3)

上面的代码只是一部分,看得出来,上面需要的files是一个KeyValuePair,key是string,value是元祖(参数名,流,类型);
因此检查代码发现我之前用的是文件流的方式,因此导致提示此错误。附上正确的C#代码

                          using (var client = new HttpClient(hch))
                          {
                              try
                              {
                                  var img = new MultipartFormDataContent();
                                  img.Add(new ByteArrayContent(buff), "img","captcha.png");
                                  var hrm = new HttpRequestMessage(HttpMethod.Post, url);
                                  hrm.Content = img;
                                  var response = client.SendAsync(hrm, HttpCompletionOption.ResponseContentRead).Result;
                                  Console.WriteLine($"{response.StatusCode} {(int)response.StatusCode}");
                                  Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                                  if (response.StatusCode == HttpStatusCode.InternalServerError)
                                      err++;
                              }
                              catch (Exception e)
                              {
                                  Console.WriteLine(e);
                              }
                          }

这样格式就对应上来了。
主要的原因是HttpContent内容对不上导致服务器直接关闭了链接。
在此之前,我使用的是HttpContent是这样写的

img.Add(new ByteArrayContent(buff), "img");
//因此这个与接口所需参数不符

综上所述:提示这个错误时,应该先检查自己的传输的参数是否与服务器的参数一致。

另外,此提示是由服务的直接断开链接的!此时服务器是接受到你所提供的参数的,只是验证不通过!

你可能感兴趣的:(编程杂项)