C # HttpWebRequest на Windows Service: изменение любого свойства в запросе не дает эффекта - PullRequest
0 голосов
/ 21 ноября 2018

Я написал службу Windows WCF (работающую как LocalSystem), получающую запросы от веб-сервера, и одним из шагов проверки данных является их повторная отправка на веб-сервер (https), который выполняет эту работу.

Теперь я пытаюсь отправить запрос с помощью класса "HttpWebRequest".

Следующее выполняет мой запрос: (Параметр: строка a_Body содержит строковый Json)

// Accept all certificates
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
    return true;
};

// Encode given Json coded Data to Bytearray
byte[] formData = Encoding.UTF8.GetBytes( a_Body );

HttpWebRequest req = WebRequest.Create(new Uri( ApiVerifyUrl )) as HttpWebRequest;
req.KeepAlive = false;
req.Method = "POST";
req.Accept = "application/json";
req.ContentType = "application/json";

// Test Header, to see, if it would be set!
req.Headers.Add("X-Test", "Test123");

req.ContentLength = formData.Length;

// fiddler connection
req.Proxy = new WebProxy("[ip]", [port]);

using (Stream post = req.GetRequestStream()) // <- throws error ( see log below )
{
    post.Write( formData, 0, formData.Length );
    post.Close();
}

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

Я такжеперехватывая исключение, его выдает:

using (Stream post = req.GetRequestStream())

Подробности к исключению:

[21.11.2018 08:36:21] Emergency:  
An exception "WebException" occurred:  
 - Message:   
   Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..  
   (= The Connection was closed: unexpected error)  
 - Source:   
   System  
 - Target:   
   System.IO.Stream GetRequestStream(System.Net.TransportContext ByRef)  
 - Stack Trace:   
   bei System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)  
   bei System.Net.HttpWebRequest.GetRequestStream()  
   bei Intrasearch.Service.HttpServer.ValidateRequestByApi(String a_Body)   
 - InnerException: "IOException":  
    - Message:   
      Von der Übertragungsverbindung können keine Daten gelesen werden: Eine   vorhandene Verbindung wurde vom Remotehost geschlossen.
      (= Data cant be read from the Connection: Remotehost closed the connection)
    - Source:   
      System  
    - Target:   
      Int32 Read(Byte[], Int32, Int32)    
    - Stack Trace:   
      bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)  
      bei System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)  
      bei System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer,   AsyncProtocolRequest asyncRequest)  
      bei System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)   
      bei System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)  
      bei System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)  
      bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)  
      bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)  
      bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)  
      bei System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)  
      bei System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)  
      bei System.Net.ConnectStream.WriteHeaders(Boolean async)   
 - InnerException: "SocketException":
       - Message: 
         Eine vorhandene Verbindung wurde vom Remotehost geschlossen 
         (= An Connection was closed by the remotehost) 
       - Source:   
         System  
       - Target:   
         Int32 Read(Byte[], Int32, Int32)  
       - Stack Trace:  
         bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 

Теперь я спрашиваю: почему мои атрибуты не установлены должным образом, чтобы запрос мог 'установить правильную связь?Тот же код выполняется в консольном приложении с тем же веб-сервером.Я сейчас ищу дни.

1 Ответ

0 голосов
/ 21 ноября 2018

Я использовал старую версию .Net Framework (4.0), где Tls 1.2 не поддерживался.Наш сервер ограничил любое соединение без Tls 1.2, поэтому произошла эта ошибка.

Я просто изменил версию .Net на 4.5 и добавил:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

И теперь это работает!

...