2015-05-08 3 views
1

Итак, я пытаюсь написать клиент для определенного сервера, имитируя поведение того, что я вижу в инструментах dev браузеров, таких как Chrome и Firefox. Я использую HttpWebRequest и, похоже, отлично работает для меня для INDIVIDUAL обмена, но как только мне нужно использовать другой, он никогда не работает. Я решил, что мне просто нужно будет сохранить свой ConnectionToken, чтобы сервер мог распознать меня как одного клиента по нескольким запросам, но это явно не так. Вот пример.Несколько HttpWebRequests при одном соединении

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections; 
using System.Net; 
using System.IO; 
using System.Diagnostics; 
using System.Web.Script.Serialization; 


namespace WebClient 
{ 
    class WebClientProgram 
    { 

     static void Main(string[] args) 
     { 
      //FIRST REQUEST, NEGOTIATE 
      DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); 
      long epoch = (long)Math.Floor((DateTime.Now.ToUniversalTime() - unixStart).TotalSeconds); 
      String timestamp = Convert.ToString(epoch); 
      String uri = "http://domain/signalr/negotiate?_=" + timestamp; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      //Set REQUEST values 
      request.Credentials = new NetworkCredential("username", "password"); 
      request.Method = "GET"; 
      request.KeepAlive = true; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      JavaScriptSerializer jSerialize = new JavaScriptSerializer(); 
      Dictionary<string, string> responseDictionary = jSerialize.Deserialize<Dictionary<string, string>>(reader.ReadToEnd()); 
      reader.Close(); 
      response.Close(); 
      String connectionToken = responseDictionary["ConnectionToken"];//Save my unique connection token 
      String connectionID = responseDictionary["ConnectionId"]; 
      String protocolVersion = responseDictionary["ProtocolVersion"]; 

      //SECOND REQUEST, START 
      epoch = (long)Math.Floor((DateTime.Now.ToUniversalTime() - unixStart).TotalSeconds); 
      timestamp = Convert.ToString(epoch); 
      uri = "http://domain/signalr/start?clientProtocol=" + protocolVersion + "&connectionToken=" + connectionToken + "&_=" + timestamp; 
      request = (HttpWebRequest)WebRequest.Create(uri); 
      //Set REQUEST values 
      request.Credentials = new NetworkCredential("username", "password"); 
      request.Method = "GET"; 
      request.KeepAlive = true; 

      response = (HttpWebResponse)request.GetResponse();//On this line I receive a 400 error from the server 
      reader = new StreamReader(response.GetResponseStream()); 
      File.WriteAllText(@"start.txt", reader.ReadToEnd()); 
     } 
    } 
} 

Так это я пытаюсь сделать основной обмен на сервере SignalR, который я пытаюсь прикрепить к. Сначала я ПЕРЕГОВОРЯЮ и возвращаю отдельный ConnectionToken, который я использую для следующего запроса. Однако в следующем запросе всегда возникает ответ «400: идентификатор соединения находится в неправильном формате». Любые мысли? Спасибо, парни.

ответ

0

Просто глядя на свой код, вы пропускаете амперсанд в URL-адресе?

"&connectionToken=" + connectionToken + "здесь_=" + timestamp

+0

Ах, когда я переписывал-склейку из моего кода здесь я удалил некоторые из более личные данные URL-адрес и случайно стерта, что амперсанд. Он действительно включен в мой код, и ошибка по-прежнему сохраняется. Хорошее пятно! Здесь я изменю код, чтобы это отразить. – ArcaneLight

+0

Это должен был быть комментарий. Пожалуйста, удалите этот ответ - мне стоило 20 секунд, чтобы выяснить, насколько это актуально. Код исправлен. Благодарю. –

Смежные вопросы