我编写了在服务器方法调用后运行的过滤器,并将其内容打印到控制台。代码是用ASP.NET core v2.1编写的:
public class MyCustomFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
// ERROR on the next line!
using (StreamReader sr = new StreamReader(context.HttpContext.Response.Body))
{
Console.WriteLine(sr.ReadToEnd());
}
base.OnResultExecuted(context);
}
}
Run Code Online (Sandbox Code Playgroud)
结果-异常:
流不可读。
进一步的调查使我发现流 ( context.HttpContext.Response) 具有这些值:
这可以解释为什么它无法读取正文......
怎么解决?
我需要拦截将发送到浏览器的所有html并替换那里的一些标签.这需要在全球范围内和每个视图中完成.使用C#在ASP.NET MVC 3或4中执行此操作的最佳方法是什么?在过去,我使用Global.asax(vb)中的'response.filter'在ASP.net Webforms中完成了此操作
Private Sub Global_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRequestHandlerExecute
Response.Filter = New ReplaceTags(Response.Filter)
End Sub
Run Code Online (Sandbox Code Playgroud)
这会调用我创建的一个继承自system.io.stream的类,并通过html来替换所有标记.我不知道如何使用C#在ASP.NET MVC 4中执行此操作.你可能已经注意到我在MVC世界中是一个全新的人.
我的请求样本
http://localhost:8065/api/note
POST
content-type:application/json
request body: { "id" : "1234", "title" : "test", "status" : "draft"}
Run Code Online (Sandbox Code Playgroud)
应该是
{ "msg" : "ok", "code" : 1}
Run Code Online (Sandbox Code Playgroud)
那个行动
public async Task<IActionResult> Post([FromBody]NoteModel model)
Run Code Online (Sandbox Code Playgroud)
为了自动记录每个请求,我创建了一个属性来完成这项工作.该属性如下所示:(来自Microsoft Docs)
public class SampleActionFilterAttribute : TypeFilterAttribute
{
public SampleActionFilterAttribute():base(typeof(SampleActionFilterImpl))
{
}
private class SampleActionFilterImpl : IActionFilter
{
private readonly ILogger _logger;
public SampleActionFilterImpl(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<SampleActionFilterAttribute>();
}
public void OnActionExecuting(ActionExecutingContext context)
{
}
public void OnActionExecuted(ActionExecutedContext context)
{
_logger.LogDebug("[path]" + context.HttpContext.Request.Path);
_logger.LogDebug("[method]" + context.HttpContext.Request.Method);
_logger.LogDebug("[body]"); …Run Code Online (Sandbox Code Playgroud)