Позоваване на параметри на действие от ExceptionLogger

Искам да използвам новия метод за глобално регистриране на грешки. Написах клас, който наследява ExceptionLogger и заменя метода Log(). След това го регистрира като заместител.

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, но съм го виждал само null и тази wiki страница заявява, че ActionContext и ControllerContext почти винаги ще бъдат нулеви.

Освен това не мога да получа потока на съдържанието, защото неговият поток вече е прочетен, преди да стигне до моя регистратор. Така че няма начин да получа публикуван json от съдържанието на заявката.

Може би има начин да получите публикуваните данни от HttpContext.Current или по някакъв друг начин?


person Jeff LaFay    schedule 09.04.2014    source източник


Отговори (2)


Добре, изглежда, че мога да получа основния текст от HttpContext, като прочета InputStream на обекта Request по този начин:

string bodyText = string.Empty;

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

Този код ми е бил успешен досега за получаване на моите публикувани json данни.

person Jeff LaFay    schedule 09.04.2014
comment
ТИ МИ СПАСИ ЗАДНЕТО! Бях на път да се самоубия. Беше супер разочароващо да не мога да регистрирам съдържание на заявка. - person Stefan Vasiljevic; 15.09.2016
comment
@StefanVasiljevic Толкова се радвам, че помогна и че спасих живота ти. Мисля, че това е първият път, когато кодът ми прави това хаха. наздраве! - person Jeff LaFay; 16.09.2016
comment
@jlafay ..и няма да е последното! ноември 2017 г., все още спасява животи! - person CloudyOne; 27.11.2017
comment
@jlafay Това може да звучи тъпо, но как да стигнете от ExceptionLoggerContext до HttpContext - person Achilles; 05.01.2018
comment
@Ахил, това изобщо не е тъп въпрос. Това е много основателно запитване. HttpContext и HttpContext.Current са статични. Така че можете да получите достъп до текущия контекст по всяко време. - person Jeff LaFay; 05.01.2018
comment
Вие сте наистина страхотни! Благодаря ти. - person Achilles; 05.01.2018

Ето параметри на действие за бъдещи справки

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"];
person Whoever    schedule 04.11.2015