Со вчерашнего дня при обращении POST запроса из C# приложения на сайт стал получать ошибку:
The underlying connection was closed: An unexpected error occurred on a send.
Выполнил все предложения с MSDN
https://support.microsoft.com/en-us/kb/915599
Но не помогло.
При этом работают GET запросы, обращения через HTTP протокол или curl с другого сайта.
Более того - судя по логам для некоторых пользователей аналогичные POST запросы работают.
Пробовал с другого компа запускать - также не работает, да и письмо от пользователя об этой проблеме получил.
Пробовал менять версию PHP, но ни 5.6.19, ни 7.0.4 версии не работают.
Есть ли какие-то идеи как решить?
Спасибо.
PS.
Прилагаю код
using System;
using System.Collections.Specialized;
using System.Net;
using System.Security.Authentication;
using Kstudio.Manager;
using Kstudio.Manager.Settings;
namespace PostRequestTest
{
public static class Program
{
static void Main(string[] args)
{
UpdateStart("https");
UpdateStart("http");
Console.ReadLine();
}
private static void UpdateStart(string protocol)
{
Console.WriteLine("Sending a POST data through " + protocol.ToUpper());
WebInfo.Protocol = protocol;
ServicePointManager.MaxServicePointIdleTime = 5000 * 10;
ServicePointManager.Expect100Continue = false;
try
{
var result = GetUpdateVersion();
//result = result.Remove(result.Length/2);
if (!string.IsNullOrEmpty(result))
result = result.Remove(result.Length / 100) + "...\n\n Success!!";
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
Console.WriteLine("====================\n" );
}
public static string GetUpdateVersion()
{
var req = new ExtWebClient
{
Encoding = System.Text.Encoding.UTF8,
PostParam = new NameValueCollection()
};
req.PostParam.Add("data", "somedata");
req.PostParam.Add("product", 1.ToString());
//ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
try
{
byte[] result = req.DownloadData(new System.Uri(WebInfo.CheckUpdateUrl));
return DeserializeData(result);
}
catch (WebException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
catch (AuthenticationException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
return null;
}
private static string DeserializeData(byte[] result)
{
if (result == null || result.Length == 0)
return string.Empty;
return System.Text.Encoding.UTF8.GetString(result, 1, result.Length - 1);
}
}
}
using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;
namespace Kstudio.Manager
{
internal sealed class ExtWebClient : WebClient
{
public NameValueCollection PostParam { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest tmprequest = base.GetWebRequest(address);
HttpWebRequest request = tmprequest as HttpWebRequest;
//Setting KeepAlive to false
if (request != null)
request.KeepAlive = false;
if (request != null && PostParam != null && PostParam.Count > 0)
{
StringBuilder postBuilder = new StringBuilder();
request.Method = "POST";
//build the post string
for (int i = 0; i < PostParam.Count; i++)
{
var key = PostParam.GetKey(i);
var value = PostParam.Get(i);
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
continue;
postBuilder.AppendFormat("{0}={1}", Uri.EscapeDataString(key),
Uri.EscapeDataString(value));
if (i < PostParam.Count - 1)
{
postBuilder.Append("&");
}
}
byte[] postBytes = Encoding.ASCII.GetBytes(postBuilder.ToString());
request.ContentLength = postBytes.Length;
//request.Accept = "application/json";
//request.UserAgent = "curl/7.37.0";
request.ContentType = "application/x-www-form-urlencoded";
var stream = request.GetRequestStream();
if (stream != null)
{
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();
stream.Dispose();
}
}
return tmprequest;
}
}
}