2014-04-09 43 views
8

我想利用新的方法來記錄全局錯誤。我寫了一個繼承ExceptionLogger的類,並覆蓋Log()方法。然後將其註冊爲替代品。引用來自ExceptionLogger的動作參數

public class TraceExceptionLogger : ExceptionLogger 
{ 
    public async override void Log(ExceptionLoggerContext context) 
    { 
     // This is always empty string 
     var content = await context.Request.Content.ReadAsStringAsync(); 

     // This is almost always null 
     var actionContext = context.ExceptionContext.ActionContext; 
    } 
} 

我可以通過ExceptionLoggerContext對象的屬性挖掘得到幾乎我需要的一切,除了動作參數。確實有一個ActionContext屬性,但我只看到它爲空,並且this wiki page指出ActionContextControllerContext幾乎總是爲空。

此外,我無法獲取內容流,因爲它的流在它到達我的記錄器之前已經被讀取。因此,我無法從請求的內容中獲取任何已發佈的json。

是否有辦法從HttpContext.Current或其他方式獲取發佈的數據?

回答

7

好了,它看起來像我可以通過這樣的Request對象的InputStream讀取得到的HttpContext正文:

string bodyText = string.Empty; 

using (var sr = new StreamReader(HttpContext.Current.Request.InputStream)) 
{ 
    sr.BaseStream.Seek(0, SeekOrigin.Begin); 
    bodyText = sr.ReadToEnd(); 
} 

該代碼已成功我迄今讓我張貼的JSON數據。

+1

你救了我的屁股!我正要殺死自己。無法登錄請求內容令人感到非常沮喪。 –

+0

@StefanVasiljevic我很高興它的幫助,我拯救了你的生命。我認爲這是我的代碼第一次做到這一點,哈哈。乾杯! – jlafay

+1

@jlafay ..它不會是最後一個! 2017年11月,仍挽救生命! – CloudyOne

4

這裏的動作參數以供將來參考

public class HomeController : ApiController { 
    public string Get(string id, [FromHeader] Whoever whoever) { 

    public string Post(Whatever whatever) { 


var args = ((ApiController) context.ExceptionContext 
      .ControllerContext.Controller)).ActionContext.ActionArguments 

if (args.ContainsKey("whatever")) { 
    var whatever = (Whatever)args["whatever"];