/================== 来路和关键字统计==================
在项目A的A.aspx页面实现功能,代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
string str=Request.QueryString["r"].ToString();
if(str=="")
str=null;
this.GetKeyAndWeb(str);
}
}
//搜索引擎特征
//begin
private string[][] _Enginers = new string[][] {
new string[]{"baidu","gb2312","wd"},
new string[]{"google","utf8","q"}, new string[]{"yahoo","utf8","p"},
new string[]{"sogou","gb2312","query"},
new string[]{"3721","gb2312","p"},
new string[]{"yisou","utf8","search"},
new string[]{"soso","gb2312","w"},
new string[]{"zhongsou","gb2312","w"},
new string[]{"live","utf8","q"},
new string[]{"tom","gb2312","word"},
new string[]{"163","gb2312","q"},
new string[]{"iask","gb2312","k"}, new string[]{"openfind","utf8","q"},
new string[]{"alltheweb","utf8","q"},
new string[]{"lycos","utf8","query"},
new string[]{"onseek","utf8","q"}
};
//end
//搜索引擎名称
//begin
private string _EngineName = "";
public string EngineName
{
get
{
return _EngineName;
}
}
//end
//搜索引擎编码
//begin
private string _Coding = "utf8";
public string Coding
{
get
{
return _Coding;
}
}
//end
//搜索引擎关键字查询参数名称
//begin
private string _RegexWord = "";
public string RegexWord
{
get
{
return _RegexWord;
}
}
//end
//建立搜索关键字正则表达式
//begin
private string _Regex = @"(";
public void EngineRegEx(string myString)
{
//提取地址里面的搜索引擎名
for (int i = 0, j = _Enginers.Length; i < j; i++)
{
if (myString.IndexOf(_Enginers[i][0])>-1)
{
_EngineName = _Enginers[i][0]; //搜索引擎的名称 如baidu,google
_Coding = _Enginers[i][1]; //编码方式 uft-8,gb2312
_RegexWord = _Enginers[i][2]; //参数 wd,u
_Regex += _EngineName + @"".+.*[?/&]" + _RegexWord + @"[=:])(?<key>[^&]*)";
break;
}
}
}
//end
//得到搜索引擎关键字
//begin
public string SearchKey(string myString)
{
EngineRegEx(myString.ToLower()); //调用上面的方法
if (_EngineName != "")
{
Regex myReg = new Regex(_Regex, RegexOptions.IgnoreCase);
Match matche = myReg.Match(myString);
myString = matche.Groups["key"].Value;
//去处表示为空格的+
myString = myString.Replace("+", " ");
if(_Coding=="gb2312") //如果是中文的 如百度 就用该种解码方式
{
myString=HttpUtility.UrlDecode(myString,Encoding.GetEncoding("gb2312"));
}
else //如 google 的解码方式
{
myString=HttpUtility.UrlDecode(myString,Encoding.GetEncoding("utf-8"));
}
}
return myString;
}
//end
//获取来路并提取关键字
public void GetKeyAndWeb(string str)
{
string keys="";
string address=str;
if(address!=null && _EngineName != "")
keys = this.SearchKey(address);
string dt=DateTime.Now.ToShortDateString();
//转换成搜素引擎的中文名字 便于查阅
string ChineseEngine="";
switch(_EngineName)
{
case "baidu":
ChineseEngine="百度";
break;
case "google":
ChineseEngine="谷歌";
break;
case "yahoo":
ChineseEngine="雅虎";
break;
case "sogou":
ChineseEngine="搜狗";
break;
case "3721":
ChineseEngine="3721";
break;
case "163":
ChineseEngine="网易";
break;
case "yisou":
ChineseEngine="易搜";
break;
case "soso":
ChineseEngine="搜搜";
break;
case "zhongsou":
ChineseEngine="中搜";
break;
default://其他不常用的 不用转换
ChineseEngine=_EngineName;
break;
}
//
//写入数据到数据库
if(Session["sign"]==null)
{
Session["sign"]="sign";
//下面的判断比较关键的
if(address!=null) //来路不为空
{
new CountsPageBiz().WebCount(address,dt);
if(keys!="") //关键字 防止来路是通过链接等来的
{
new CountsKeyBiz().KeyCount(keys, ChineseEngine, dt);
}
}
else
{
address="直接输入网址";
new CountsPageBiz().WebCount(address,dt);
}
}
}
在项目B的B.aspx 的页面文件引用A.aspx
< script id="tj"></script>
<script type="text/javascript">
var o=document.GetelementByID("tj");
o.src="/A/A.aspx?r="+document.referrer:
</script>
============================OK=============================
刚开始在A.aspx里面统计来路,结果怎么弄来路都是B.aspx!这个问题困扰了我好几天,解决问题的关键就在B.aspx引用A.aspx的时候, 原来是直接这样做的:<script type="text/javascript" src="/A/A.aspx"></script>.也想到了在这里传个参数(B.aspx的来路即 document.referrer)给A.aspx,但是这个参数无法统计来路。?!
我又想到在B.aspx.cs里面得到来路:address=Request.servervariables["Http_Referer"] ,然后这样写:<script type="text/javascript" src="/A/A.aspx?r=<%=%>"></script>,但是这样写比较麻烦,如果又很多页面需要统计,那 么每个页面都要这样写。!!
终于,俊的一个同学刚好也在做这个,问题终于解决了!
爽哉!轉