2015-05-08 61 views
1

所以我试图为特定的服务器编写一个客户端,模仿我在Chrome和Firefox等浏览器的开发工具中看到的行为。我使用HttpWebRequest,它似乎对我个人交流非常有用,但只要我需要使用另一个它永远不会工作。我想我只需要存储我的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服务器,这正是我想要附加。我首先NEGOTIATE并获取一个独特的ConnectionToken,用于以下请求。然而,接下来的请求总是会响应“400:连接标识格式不正确”。 有什么想法?多谢你们。

回答

0

只看你的代码,你是否错过了URL中的符号?

"&connectionToken=" + connectionToken + "这里_=" + timestamp

+0

啊,当我复制粘贴从我的代码在这里我删除了一些网址的更多个人资料和意外删除的符号。它实际上包含在我的代码中,错误仍然存​​在。虽然好点!我会在这里更改代码以反映这一点。 – ArcaneLight

+0

这应该是一个评论。请删除这个答案 - 花费我20秒来判断它是否相关。代码已修复。谢谢。 –