根据这篇MSDN文章:
它说cs(Referrer)
包含可以从IIS日志文件中读取的REFERER信息。
我正在尝试使用ASP.NET Repeater控件显示日志信息:
<asp:Repeater ID="rptlIISLogEntries" runat="server">
...
...
<ItemTemplate>
<tr>
<td><%# Eval("time")%></td>
<td><%# Eval("cs(Referrer)")%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
Eval("cs(Referrer)"
行引发异常:
DataBinding:'System.Data.DataRowView' does not contain a property with the name 'cs'.
我的问题是,如何在转发器中显示REFERER信息?
解析日志文件并将其绑定到转发器的代码如下:
string theDate =txtDate.Text;
string FILE_NAME = @"\\" +txtMachine.Text +
@"\C$\WINNT\System32\LogFiles\" +
drpSiteBox.SelectedItem.Text + @"\ex" + theDate + ".log";
FileStream fs = new FileStream(FILE_NAME, FileMode.Open,
FileAccess.Read,FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);
string strResult = sr.ReadToEnd();
sr.Close();
fs.Close();
sr=null;
fs=null;
string[] arLogLines = strResult.Split(Convert.ToChar("\n"));
dt = new DataTable("log");
string revisedColmNames=arLogLines[3].Replace("#Fields: ","");
string[] arColm=revisedColmNames.Split(Convert.ToChar(" "));
for(int j=0;j<arColm.Length;j++)
{
dt.Columns.Add(arColm[j]);
Debug.WriteLine(arColm[j]);
}
for (i =arLogLines.Length-1; i>3;i--)
{
// need this because some logs get additional data appended
// aren't unhandled exceptions great? The CLR just loves 'em...
try
{
dt.Rows.Add(arLogLines[i].Split(Convert.ToChar(" ")));
}
catch {}
}
DataGrid1.DataSource=dt;
DataGrid1.DataBind();
中的代码相同
答案 0 :(得分:1)
这里的问题是数据绑定器对数据表的操作方式以及处理列/属性名称的方式。 Eval
使用反射,列名中的括号字符导致此失败(我需要慢慢记忆所有这些是如何工作的,这已经有一段时间了。)
只需将基础Container.DataItem
转换为它的类型(DataRowView
),然后选择列:
<%# ((System.Data.DataRowView)Container.DataItem)["cs(Referer)"]%>
这也更快,因为不使用反射很慢。
另外我注意到你拼错了'Referer'(你有两个'r'),所以也要小心。
要使用Eval()
来实现此功能,您需要做更多的工作。改变这个:
for(int j=0;j<arColm.Length;j++)
{
dt.Columns.Add(arColm[j]);
Debug.WriteLine(arColm[j]);
}
对此:
for (int j = 0; j < arColm.Length; j++)
{
string colName = arColm[j].Replace("(", "_").Replace(")", "");
dt.Columns.Add(colName);
Debug.WriteLine(colName);
}
在数据绑定器Eval
表达式中,更改名称中包含括号的任何列:
Eval("cs(Referer)")
为:
Eval("cs_Referer")
但我会选择第一种方法,它不那么具有侵入性,而且速度更快。