相关疑难解决方法(0)

读取 Filter 中的 Response.Body 流

我编写了在服务器方法调用后运行的过滤器,并将其内容打印到控制台。代码是用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) 具有这些值:

  1. 可以读取 = false
  2. 可以寻找=假

这可以解释为什么它无法读取正文......

怎么解决?

c# asp.net asp.net-web-api asp.net-core

9
推荐指数
1
解决办法
1万
查看次数

asp.net MVC 3/4相当于一个response.filter

我需要拦截将发送到浏览器的所有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世界中是一个全新的人.

asp.net response.filter asp.net-mvc-3

5
推荐指数
2
解决办法
5087
查看次数

有没有办法在.NET Core FilterAttribute中获取请求体?

我的请求样本

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)

c# asp.net-core-mvc .net-core asp.net-core

5
推荐指数
1
解决办法
1万
查看次数