Asp.net web api 从ExceptionLogger引用操作参数
我想利用新方法全局记录错误。我编写了一个类,它继承了Asp.net web api 从ExceptionLogger引用操作参数,asp.net-web-api,asp.net-web-api2,Asp.net Web Api,Asp.net Web Api2,我想利用新方法全局记录错误。我编写了一个类,它继承了ExceptionLogger并重写了Log()方法。然后注册为替代品 public class TraceExceptionLogger : ExceptionLogger { public async override void Log(ExceptionLoggerContext context) { // This is always empty string var content =
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
几乎总是null
此外,我无法获取内容流,因为它的流在到达我的记录器之前已经被读取。因此,我无法从请求的内容中获取任何发布的json
是否有一种方法可以从HttpContext.Current或其他方式获取发布的数据?好的,看起来我可以通过读取请求对象上的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数据。以下是操作参数,供将来参考
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"];
你救了我的命!我正要自杀。无法记录请求内容是非常令人沮丧的。@StefanVasiljevic我很高兴它起了作用,我救了你的命。我想这是我的代码第一次这么做,哈哈。干杯@这不是最后一次!2017年11月,仍然在拯救生命@阿喀琉斯,这根本不是一个愚蠢的问题。这是一个非常有效的调查。HttpContext和HttpContext.Current是静态的。因此,你可以在任何给定的时间访问当前上下文。你真是太棒了!非常感谢。