2009-07-22 48 views
2

摘要:如何配置Web服務,以便始終可以寫入事件日誌(無論調用者)? 詳細信息: 我有一個Web服務,它將條目寫入應用程序日誌。我通過一個小控制檯應用程序爲此建立了事件源,並且我認爲我理解了這一部分內容。當我測試這個WS時,我看到我成功地將我的條目寫入事件日誌。匿名用戶調用Web服務時,無法寫入事件日誌

承載此WS的虛擬目錄確實是而不是允許匿名訪問並且僅配置爲集成Windows身份驗證。

我有一個Web客戶端應用程序調用此Webservice。當Web客戶端站點僅配置爲集成Windows身份驗證時,根據需要調用Webservice會導致日誌記錄。

但是,如果我將Web客戶端網站更改爲允許匿名訪問,那麼Webservice會嘗試將結果記錄在InvalidOperationException中。我忽略它,但不管它如何被調用,知道如何在Web服務中記錄日誌都會很好。這裏有一點我的代碼:以上

public FileService() 
    { 
     try 
     { 
      if (!EventLog.SourceExists(g_EventSource)) 
       EventLog.CreateEventSource(g_EventSource, g_EventLog); 

      System.Security.Principal.WindowsIdentity UserIdentityInfo; 
      UserIdentityInfo = System.Security.Principal.WindowsIdentity.GetCurrent(); 
      string AuthType = UserIdentityInfo.AuthenticationType; 

    if (AuthType == "Kerberos") 
    { engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials; } 
    else 
    { engineWSE.Credentials = new System.Net.NetworkCredential("u", "p", "domain"); } 

    EventLog.WriteEntry(g_EventSource, 
       "Caller: " + UserIdentityInfo.Name + 
       " AuthType: " + UserIdentityInfo.AuthenticationType, 
       EventLogEntryType.Information, 1); 
     } 
     catch (InvalidOperationException e) 
     { 
      // do nothing to ignore: "Cannot open log for source 'myAppSourceName'. You may not have write access." 
     } 
    } 

構造函數的例子是在這裏有點做作(我主要感興趣的是能寫出來的Web服務相關的錯誤信息)。

我希望有一種方法來配置Web服務虛擬目錄(或其中的代碼),以便可以進行日誌記錄,而不管它如何被調用。

回答

2

你還應該檢查你的web.config。

如果IIS設置爲匿名,並且web.config設置爲windows/impersonate。然後它將是嘗試寫入事件日誌的匿名IIS用戶。

+0

謝謝。根據您的答案,我會重新仔細閱讀我的問題。我確實在承載我的web服務的網站的web.config中有。我需要這個,因爲我需要INTRAnet webclient的身份(請參閱我如何測試身份驗證類型並相應地傳遞憑據)。所以,你是說因爲在web.config中「模仿」,它表現得好像我爲我的web服務網站檢查了「匿名訪問」?我想你會說是的。鑑於我的目標,無論如何都要配置此功能以便在任何情況下進行日誌記錄? – 2009-07-23 17:59:53

3

允許網絡服務to write to the Event Log,但不創建事件源。您可以授予HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\的權限以允許它創建 - 但是如果您已經在安裝時創建它,則不需要。

它也可能在SourceExists上失敗 - 因爲這需要枚舉相同的註冊表項。我可能會刪除SourceExists/Create檢查並相信它已經存在 - 如果您是匿名用戶,則無法創建它。

相關問題