2012-06-06 50 views
2

我正在使用WCF服務,並且我實現了IErrorHandler。在的HandleError方法,我要檢索的呼叫者的用戶名,以設置ThreadContext屬性log4net的(保存的用戶名,在SQL Server中的異常詳細信息一起)Log4Net&WCF IErrorHandler - ServiceSecurityContext.Current.WindowsIdentity.Name返回NullReferenceException

我的代碼工作良好如果我避免嘗試檢索調用者的用戶名。

這是對的HandleError方法內代碼被返回的NullReferenceException行:

string username = ServiceSecurityContext.Current.WindowsIdentity.Name; 

看來,在該點處的IErrorHandler中,踢的的HandleError方法原來的來電者信息已被處置。

沒有人有任何想法,我怎麼可以檢索IErrorHandlerHandlerError方法中調用者的用戶名?

感謝您的幫助!

+0

我無法理解您是否可以在HandleError方法之外獲取該名稱,或者它是否也失敗。另外,您確定調用該服務的系統是否具有關聯的Windows帳戶? –

+0

嗨塞爾吉奧,謝謝你的迴應。我現在只是看到了這個信息,直到星期一我纔會回來工作。我很確定我能夠在ProvideFault方法中檢索用戶名,而不是HandleError方法。我必須在星期一回到你身邊。 – Craig

回答

3

感謝那些迴應幫助的人。我的安全似乎配置正確,但我無法檢索WCF服務中接口的IErrorHandler方法的HandleError方法中的用戶名。但是,我可以在ProvideFault方法中檢索用戶名。因此,我在ProvideFault方法中設置的ErrorHandlerIErrorHandler)類中聲明瞭類級變量,然後在ErrorHandler方法中讀取並記錄異常。這是一種「解決方法」,而不是我的偏好,但不幸的是,我似乎無法訪問方法內的安全上下文。

下面是代碼的示例:

public class ErrorHandler : IErrorHandler, IServiceBehavior 
{ 
    private string username = null; 

    public bool HandleError(Exception error) 
    { 
     //Log the exception along with the username. 
     //...logging call including the username class member string... 

     //Return true to indicate we have performed our behaviour. 
     return true; 
    } 

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 
      //Retrieve the username. 
      username = ServiceSecurityContext.Current.WindowsIdentity.Name; 
    } 
} 
0

使用類等級變量似乎有一個副作用。處理程序的相同實例似乎用於處理的每個錯誤(待確認)。所以如果兩個錯誤同時出現,我不知道它會如何反應。相反,在ProvideFault中,我使用收到的異常作爲參數將用戶名傳送到HandleError方法。一個例外有一個「數據」屬性,它是一個字典。我只需添加兩個鍵值對(一個用於PrimaryIdentity,一個用於WindowsIdentity)。在HandleError中,我檢索收到的異常的Data屬性中的信息作爲參數。

相關問題