Ссылка на параметры действия из 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 и эта вики-страница утверждает, что ActionContext и ControllerContext почти всегда будут нулевыми.

Кроме того, я не могу получить поток контента, потому что его поток уже прочитан до того, как он попадет в мой регистратор. Поэтому у меня нет возможности получить какой-либо опубликованный json из содержимого запроса.

Есть ли способ получить опубликованные данные от HttpContext.Current или каким-либо другим способом?


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


Ответы (2)


Хорошо, похоже, я могу получить основной текст из HttpContext, прочитав InputStream в объекте запроса следующим образом:

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