关键点
1.保持session获取http数据
服务器通过session来保存用户的数据,用户第一次访问服务器时,服务器返回唯一的session ID 而后客户端将此id放在cookie中,每次访问服务器时,均带上此seesion ID ,从而让服务器进行识别。
在c#中要想保持cookie的访问服务器,主要是用到了以下方法:
private static CookieContainer m_Cookie = new CookieContainer();
public static string GetPageContent(string m_Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_Url);
request.CookieContainer = m_Cookie;
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception)
{
return CONN_ERR;
}
string cookieheader = request.CookieContainer.GetCookieHeader(new Uri(m_Url));
m_Cookie.SetCookies(new Uri(m_Url), cookieheader);
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string result = reader.ReadToEnd();
stream.Close();
reader.Close();
response.Close();
Console.WriteLine("cookie IS :" + GetCookieJssonId(m_Cookie));
return result;
}
其中静态变量 m_Cookie
用于保持cookie,确保每次访问带上此cookie
获取图片的方法封装如下:
public static byte[] GetImgPageContent(string m_Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_Url);
request.CookieContainer = m_Cookie;
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception)
{
return new byte[0];
}
string cookieheader = request.CookieContainer.GetCookieHeader(new Uri(m_Url));
m_Cookie.SetCookies(new Uri(m_Url), cookieheader);
using (Stream stream = response.GetResponseStream())
{
using (MemoryStream ms = new MemoryStream())
{
Byte[] buffer = new Byte[1024];
int current = 0;
do
{
ms.Write(buffer, 0, current);
} while ((current = stream.Read(buffer, 0, buffer.Length)) != 0);
Console.WriteLine("cookie IS :" + GetCookieJssonId(m_Cookie));
return ms.ToArray();
}
}
}
获取cookie内容的方法 封装如下:
public static string GetCookieJssonId( CookieContainer cc)
{
string cookieName = "JSESSIONID";
List<Cookie> lstCookies = new List<Cookie>();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c1 in colCookies) lstCookies.Add(c1);
}
var model = lstCookies.Find(p => p.Name == cookieName);
if (model != null)
{
return model.Value;
}
return string.Empty;
}
2.显示图片到Image控件
通过上述的 GetImgPageContent 方法可以获取到byte[]类型的图片数据,将改数据加载到image控件的方法如下:
byte[] btyarray = GetImgPageContent();
MemoryStream ms = new MemoryStream(btyarray);
//codeImg 为wpf中image控件的名(Name)
codeImg.Source = BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.Default);
参考
https://blog.csdn.net/second_rate/article/details/77100162
https://blog.csdn.net/ruixue0117/article/details/8265698