2010-03-15 69 views
2

按照此MSDN文章:IIS日誌分析 - 如何檢索引用者信息

W3C Extended Log File Format (IIS 6.0)

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

注:這是相同的代碼在http://www.eggheadcafe.com/articles/20021203.asp

+0

您是否正在記錄這些信息?你如何記錄它,以及如何檢索它? – Oded 2010-03-15 09:04:31

+0

我登錄通過檢查INETMGR控制檯 啓用日誌記錄複選框的擴展屬性複選框還檢查 對於檢索我使用的文件流來分析日誌文件,然後使用顯示中繼asp.net是 – balalakshmi 2010-03-15 09:47:38

回答

1

這裏的問題是用做數據綁定器對數據表進行操作並處理列/屬性名稱的方式。 Eval使用反射和列名稱中的圓括號字符導致此失敗(我需要慢跑我的記憶關於所有這些工作再次,這是一段時間)。

只是澆鑄底層Container.DataItem到它是類型(DataRowView),然後挑選出柱:

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

這也是更快,因爲反射不使用這是緩慢的。

另外我注意到你錯誤地拼寫了'Referer'(你有兩個'r'),所以要注意這一點。

爲了使這個工作使用​​,而不是你需要做更多的工作。改變這一:

for(int j=0;j<arColm.Length;j++) 
{ 
    dt.Columns.Add(arColm[j]); 
    Debug.WriteLine(arColm[j]); 
} 

向該:

Eval("cs(Referer)") 

到:

Eval("cs_Referer") 

for (int j = 0; j < arColm.Length; j++) 
{ 
    string colName = arColm[j].Replace("(", "_").Replace(")", ""); 
    dt.Columns.Add(colName); 
    Debug.WriteLine(colName); 
} 

在數據粘合劑Eval表達從名稱更改與括號中的任何列

但我想o採用第一種方法,它不那麼具有侵入性,而且速度更快。

+0

,嘗試過了 請求它在本地環境中工作(我有權安裝logparser) 但在無法安裝Logparser的權限的部署服務器中無法使用。 – balalakshmi 2010-03-16 15:34:14

+0

@balalakshmi - 嗯,在這種情況下,您需要向我們展示您的腳本,該腳本會打開一個日誌文件,以及如何將此數據綁定到Repeater控件。 – Kev 2010-03-16 16:07:48

+0

Kev:我已經更新了問題代碼 – balalakshmi 2010-03-17 04:33:59