无法使用生成的令牌访问第二个服务
问题描述:
我已经提供了两个服务,其中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}¶m2={1}¶m3={2}¶m4={3}¶m5={4}¶m6={5}¶m7={6}¶m8={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();
}
}
答
最后我想通了究竟是什么问题
我为这两个请求创建新的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}¶m2={1}¶m3={2}¶m4={3}¶m5={4}¶m6={5}¶m7={6}¶m8={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();
}
}
解决