站点整合随想
前段时间要做一个项目整合,把开发的网站和以前的一个网站进行整合,主要是不希望在另一个网站的用户流失掉,出是重复利用嘛,呵呵。。
并且如果遇到一个好的站点想发个言基本都需要注册,如果整合起来的话倒也是很爽,哈哈。。。。
这个想法其实是前段时间公司需要整合DZ论坛这个鬼东西被逼着做的,想想真是恶梦,足足弄了大半个月总算是把网站和论坛整合在一起了,废话不再多说:
其实整合如果真正亲自做了的话觉得也不难,这两天查了下新浪那几大网站的整合,看得云里雾里也没有找到好的切入点(才疏学浅了,呵呵),不过倒还是觉得直接请求的方式简单:
其实就是用HttpWebRequest去请求你要整合的网站的一个类似于接口页面的内容,在被请求的页面处理如果成功则输出一个XML格式的数据,再经过请求页再用HttpWebResponse获取到被请求页的HTML内容,之后根据返回的内容进行XML解析。。。
当然为了安全起见您可以设置加密格式,类似于DZ的方法,根据生成的一个key进行解密。。。。
下面代码是请求页的内容,post是你欲请求的内容,格式:name=xxx&age=xx;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary>
/// 发送请求和获取请求后的数据
/// </summary>
/// <param name="url">请求的远程URL</param>
/// <param name="post">请求的内容</param>
/// <returns>这里返回的是一个xml格式的String字符串</returns>
private static string Conn(string url, string post)
{
bool bRetVal = false;
//创建远程请求的实例
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.AllowAutoRedirect = true;
myRequest.UserAgent = HttpContext.Current.Request.UserAgent;
//这里设置是否与远程持续连接
myRequest.KeepAlive = false;
if (string.IsNullOrEmpty(post))
myRequest.Method = "GET";
else
{
myRequest.Method = "POST";
//定义这个Stream是只是为了得到发送字串 经过编码之后的长度。
Stream myStream = new MemoryStream();
//这里要注意的是编码格式,必须与远程页面的编码格式相同,以防止出现乱码
StreamWriter myStreamWriter = new StreamWriter(myStream, Encoding.GetEncoding("UTF-8"));
myStreamWriter.Write(post);
myStreamWriter.Flush();
long len = myStream.Length;
myStreamWriter.Close();
myStreamWriter.Dispose();
myStream.Close();
myStream.Dispose();
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = len;
Stream newStream = myRequest.GetRequestStream();
myStreamWriter = new StreamWriter(newStream, Encoding.GetEncoding("UTF-8"));
myStreamWriter.Write(post);
myStreamWriter.Close();
myStreamWriter.Dispose();
newStream.Close();
newStream.Dispose();
}
////创建接收回馈的字节流类
string responseHtml = string.Empty;
myRequest.Timeout = 100000;
HttpWebResponse webResponse = null;
try
{
webResponse = (HttpWebResponse)myRequest.GetResponse();
bRetVal = true;
if (webResponse.StatusCode != HttpStatusCode.OK)
bRetVal = false;
if (bRetVal) {
//得到回写的字节流
Stream receiveStream = webResponse.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.GetEncoding("utf-8"));
responseHtml = readStream.ReadToEnd();
readStream.Close();
}
if (webResponse != null)
webResponse.Close();
}catch(Exception ex)
{
throw ex;
}
return responseHtml;
}
/// <summary>
/// 用于解析读取到的内容,当然你的xml节点可以自定义的,返回键值对数据集
/// </summary>
/// <param name="strXml"></param>
/// <returns></returns>
private Hashtable XMLOperate(string strXml)
{
strXml = strXml.Replace("&", "&");
Hashtable ht = new Hashtable();
XmlDocument XMLDom = new XmlDocument();
XMLDom.LoadXml(strXml);
XmlNode newXMLNode = XMLDom.SelectSingleNode("root");
int i = 0;
foreach (XmlNode xn in newXMLNode.ChildNodes)
{
ht.Add(i++, xn.InnerText);
}
return ht;
}
被请求页面的内容:
被请求页的面中,在前台必须删除除第一行之外的所有的HTML代码,因为些页面将在页面输出一个响应的xml格式的内容:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
string name = Request.Form["name"] == null ? "" : Server.HtmlDecode(Request.Form["name"].ToString());
string age=Request.Form["age"] == null ? "" : Server.HtmlDecode(Request.Form["age"].ToString());
///////////////////////////////////////////////////////////
/////// 这里根据需求处理你需要的结果等其它一些个东西//////
Response.Write(string.Format("<root><item1>{0}</item1><item2>{1}</item2></root>",name,age));