Анализ журнала IIS - как получить информацию о реферере - PullRequest
2 голосов
/ 15 марта 2010

Согласно этой статье MSDN:

Расширенный формат файла журнала W3C (IIS 6.0)

В нем говорится, что cs(Referrer) содержит информацию REFERER, которую можно прочитать из файлов журнала IIS.

Я пытаюсь отобразить информацию журнала с помощью элемента управления ретранслятора ASP.NET:

<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();

Примечание: это тот же код, что и в http://www.eggheadcafe.com/articles/20021203.asp

1 Ответ

1 голос
/ 16 марта 2010

Проблема здесь заключается в том, как механизм связывания данных работает с таблицей данных и обрабатывает имена столбцов / свойств. Eval использует отражение, а символы в скобках в именах столбцов приводят к сбою (мне нужно потрясти память о том, как все это работает снова, это было давно).

Просто приведите базовый Container.DataItem к его типу (a DataRowView), затем выберите столбец:

<%# ((System.Data.DataRowView)Container.DataItem)["cs(Referer)"]%>

Это также быстрее, потому что отражение не используется, что медленно.

Также я заметил, что вы написали «Реферер» неправильно (у вас есть два «р»), так что следите за этим.

Чтобы заставить это работать, используя 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")

Но я бы выбрал первый метод, он менее навязчив и намного быстрее.

...