2015-06-17 51 views
0

我已经提供了两个服务,其中ist服务用于登录目的,它将返回一个xml节点令牌,我将作为其他所有服务调用中的头添加,无法使用生成的令牌访问第二个服务

在所附的示例代码中有功能的CreateObject()两个功能我打登录服务和我能够成功与令牌搜索,获得的响应,并从响应我拿来令牌和调用其他功能(串令牌)并在标头中传递令牌但它给出例外[System.Net.WebException] = {"The remote server returned an error: (403) Forbidden."}

但是,当我在Chrome高级REST客户端看其给出预期的响应

在正确的方向任何建议或解决方案将是非常可观的

请参见下面的代码

private void CreateObject() 
    {   
     try 
     { 
      string abc = ""; 
      Stream datastream; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("www.example.com/abc/login"); 
      request.CookieContainer = new CookieContainer(); 
      request.AllowAutoRedirect = true; 
      request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Accept = "application/xml"; 
      request.KeepAlive = true; 
      String postData = ""; 
      request.Method = "POST"; 
      postData = String.Format("username={0}&password={1}", "sample", "sample"); 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
      request.ContentLength = byteArray.Length; 
      datastream = request.GetRequestStream(); 
      datastream.Write(byteArray, 0, byteArray.Length); 


      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      datastream = response.GetResponseStream(); 
      String sourceCode = ""; 
      using (StreamReader reader = new StreamReader(datastream)) 
      { 
       sourceCode = reader.ReadToEnd(); 
      } 
      int pos = sourceCode.IndexOf("<?"); 
      string xmlpart = sourceCode.Substring(pos); 
      //XmlReader reader1 = XmlReader.Create(sourceCode); 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xmlpart); 
      XmlNodeList objNodeList = doc.GetElementsByTagName("token"); 
      string tokens = objNodeList[0].ChildNodes.Item(0).InnerText.Trim(); 
      search(tokens); 

     } 
     catch (Exception e) 
     { 

     } 
    } 

    public void search(string token) 
     { 
      Stream datastream; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/services/suggestions/search"); 
      request.CookieContainer = new CookieContainer(); 
      // request.AllowAutoRedirect = true; 
      System.Net.ServicePointManager.Expect100Continue = false; 
      request.Headers.Add("x-csrf-token", token); 
      request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Accept = "application/x-cdf,text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8"; 
      String postData = ""; 
      request.Method = "POST"; 
      request.KeepAlive = true; 
      postData = String.Format("param1={0}&param2={1}&param3={2}&param4={3}&param5={4}&param6={5}&param7={6}&param8={7}", "0", "1","1","1","0","1","2015-06-22","2015-06-22"); 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
      request.ContentLength = byteArray.Length; 
      datastream = request.GetRequestStream(); 
      datastream.Write(byteArray, 0, byteArray.Length); 


      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      datastream = response.GetResponseStream(); 
      String sourceCode = ""; 
      using (StreamReader reader = new StreamReader(datastream)) 
      { 
       sourceCode = reader.ReadToEnd(); 
      } 

     } 

回答

0

最后我想通了究竟是什么问题

我为这两个请求创建新的cookie容器

request.CookieContainer = new CookieContainer(); 

因此服务器无法验证

错误是通过使用此代码

CookieContainer cookieJar = new CookieContainer(); 
    private void CreateObject() 
     {   
      try 
      { 
       string abc = ""; 
       Stream datastream; 
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create("www.example.com/abc/login"); 
       request.CookieContainer = cookieJar; 
       request.AllowAutoRedirect = true; 
       request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
       request.ContentType = "application/x-www-form-urlencoded"; 
       request.Accept = "application/xml"; 
       request.KeepAlive = true; 
       String postData = ""; 
       request.Method = "POST"; 
       postData = String.Format("username={0}&password={1}", "sample", "sample"); 
       byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
       request.ContentLength = byteArray.Length; 
       datastream = request.GetRequestStream(); 
       datastream.Write(byteArray, 0, byteArray.Length); 


       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       datastream = response.GetResponseStream(); 
       String sourceCode = ""; 
       using (StreamReader reader = new StreamReader(datastream)) 
       { 
        sourceCode = reader.ReadToEnd(); 
       } 
       int pos = sourceCode.IndexOf("<?"); 
       string xmlpart = sourceCode.Substring(pos); 
       //XmlReader reader1 = XmlReader.Create(sourceCode); 
       XmlDocument doc = new XmlDocument(); 
       doc.LoadXml(xmlpart); 
       XmlNodeList objNodeList = doc.GetElementsByTagName("token"); 
       string tokens = objNodeList[0].ChildNodes.Item(0).InnerText.Trim(); 
       search(tokens); 

      } 
      catch (Exception e) 
      { 

      } 
     } 

     public void search(string token) 
      { 
       Stream datastream; 
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/services/suggestions/search"); 
       request.CookieContainer = cookieJar; // same cookejar is used as was used in login call 
       // request.AllowAutoRedirect = true; 
       System.Net.ServicePointManager.Expect100Continue = false; 
       request.Headers.Add("x-csrf-token", token); 
       request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
       request.ContentType = "application/x-www-form-urlencoded"; 
       request.Accept = "application/x-cdf,text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8"; 
       String postData = ""; 
       request.Method = "POST"; 
       request.KeepAlive = true; 
       postData = String.Format("param1={0}&param2={1}&param3={2}&param4={3}&param5={4}&param6={5}&param7={6}&param8={7}", "0", "1","1","1","0","1","2015-06-22","2015-06-22"); 
       byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
       request.ContentLength = byteArray.Length; 
       datastream = request.GetRequestStream(); 
       datastream.Write(byteArray, 0, byteArray.Length); 


       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       datastream = response.GetResponseStream(); 
       String sourceCode = ""; 
       using (StreamReader reader = new StreamReader(datastream)) 
       { 
        sourceCode = reader.ReadToEnd(); 
       } 

      } 
解决