激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - 由ASP.NET Core讀取Response.Body引發(fā)的思考

由ASP.NET Core讀取Response.Body引發(fā)的思考

2023-05-08 00:02未知服務(wù)器之家 ASP.NET教程

前言 ????前幾天有群友在群里問(wèn)如何在我之前的文章《ASP.NET Core WebApi返回結(jié)果統(tǒng)一包裝實(shí)踐》的時(shí)候有點(diǎn)疑問(wèn),主要的疑問(wèn)點(diǎn)就是關(guān)于Respouse的讀取的問(wèn)題。在之前的文章《深入探究ASP.NET Core讀取Request.Body的正確方式》曾分析過(guò)

前言

????前幾天有群友在群里問(wèn)如何在我之前的文章《ASP.NET Core WebApi返回結(jié)果統(tǒng)一包裝實(shí)踐》的時(shí)候有點(diǎn)疑問(wèn),主要的疑問(wèn)點(diǎn)就是關(guān)于Respouse的讀取的問(wèn)題。在之前的文章《深入探究ASP.NET Core讀取Request.Body的正確方式》曾分析過(guò)關(guān)于Request的讀取問(wèn)題,需要讀取Respouse的場(chǎng)景同樣經(jīng)常遇到,比如讀取輸出信息或者包裝一下輸出結(jié)果等。無(wú)獨(dú)有偶Respouse的讀取同樣存在類似的問(wèn)題,本文我們便來(lái)分析一下如何進(jìn)行Response的Body讀取。

使用方式

我們?cè)谌粘5氖褂弥惺侨绾巫x取流呢?很簡(jiǎn)單,直接使用StreamReader去讀取,方式如下

public override void OnResultExecuted(ResultExecutedContext context)
{
    //操作流之前恢復(fù)一下操作位
    context.HttpContext.Response.Body.Position = 0;

    StreamReader stream = new StreamReader(context.HttpContext.Response.Body);
    string body = stream.ReadToEnd();
    _logger.LogInformation("body content:" + body);

    context.HttpContext.Response.Body.Position = 0;
    base.OnResultExecuted(context);
}

代碼很簡(jiǎn)單,直接讀取即可,可是這樣讀取是有問(wèn)題的會(huì)拋出異常System.ArgumentException:“Stream was not readable.”異常信息就是的意思是當(dāng)前Stream不可讀,也就是Respouse的Body是不可以被讀取的。關(guān)于StreamReader到底和Stream有啥關(guān)聯(lián),我們?cè)谥暗奈恼律钊胩骄緼SP.NET Core讀取Request.Body的正確方式一文中有過(guò)源碼分析,這里就不在贅述了,有興趣的同學(xué)可以自行翻閱,強(qiáng)烈建議在閱讀本文之前可以看一下那篇文章,方便更容易了解。
如何解決上面的問(wèn)題呢?方式也很簡(jiǎn)單,比如你想在你的程序中保證Response的Body都是可讀的,你可以定義一個(gè)中間件解決這個(gè)問(wèn)題。

public static IApplicationBuilder UseResponseBodyRead(this IApplicationBuilder app)
{
    return app.Use(async (context, next) =>
    {
        //獲取原始的Response Body
        var originalResponseBody = context.Response.Body;
        try
        {
            //聲明一個(gè)MemoryStream替換Response Body
            using var swapStream = new MemoryStream();
            context.Response.Body = swapStream;
            await next(context);
            //重置標(biāo)識(shí)位
            context.Response.Body.Seek(0, SeekOrigin.Begin);
            //把替換后的Response Body復(fù)制到原始的Response Body
            await swapStream.CopyToAsync(originalResponseBody);
        }
        finally
        {
            //無(wú)論異常與否都要把原始的Body給切換回來(lái)
            context.Response.Body = originalResponseBody;
        }
    });
}

本質(zhì)就是先用一個(gè)可操作的Stream比如咱們這里的MemoryStream替換默認(rèn)的ResponseBody,讓后續(xù)對(duì)ResponseBody的操作都是針對(duì)新的ResponseBody進(jìn)行操作,完成之后把替換后的ResponseBody復(fù)制到原始的ResponseBody。最終無(wú)論異常與否都要把原始的Body給切換回來(lái)。需要注意的是,這個(gè)中間件的位置盡量要放在比較靠前的位置注冊(cè),至少也要保證在你所有要操作ResponseBody之前的位置注冊(cè)。如下所示

var app = builder.Build();
app.UseResponseBodyRead();

源碼探究

通過(guò)上面我們了解到了ResponseBody是不可以被讀取的,至于為什么呢,這個(gè)我們需要通過(guò)相關(guān)源碼了解一下。通過(guò)HttpContext類的源碼我們可以看到相關(guān)定義

public abstract class HttpContext
{
    public abstract HttpResponse Response { get; }
}

這里看到HttpContext本身是個(gè)抽象類,看一下它的屬性HttpResponse類的定義也是一個(gè)抽象類

public abstract class HttpResponse
{
}

由上面可知Response屬性是抽象的,所以抽象類HttpResponse必然包含一個(gè)子類去實(shí)現(xiàn)它,否則沒(méi)辦法直接操作相關(guān)方法。這里我們介紹一個(gè)網(wǎng)站https://source.dot.net用它可以更輕松的閱讀微軟類庫(kù)的源碼,比如CLR、ASP.NET Core、EF Core等等,雙擊一個(gè)類或者屬性方法可以查找引用和定義它們的地方,非常方便,它的源碼都是最新版本的,來(lái)源就是GitHub上的相關(guān)倉(cāng)庫(kù)。找到實(shí)例化HttpResponse的為位置在HttpContext的子類DefaultHttpContext類中[點(diǎn)擊查看源碼

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲电影在线观看高清免费 | 日韩精品羞羞答答 | 久久影院免费观看 | 国产一精品久久99无吗一高潮 | 久久久精品99 | wwwcom国产| 美女啪网站 | 99麻豆久久久国产精品免费 | 欧美成人一级 | 韩国一大片a毛片 | 久操福利视频 | www亚洲成人 | 国产羞羞视频在线观看免费应用 | 成人午夜视频在线观看免费 | 羞羞色院91精品网站 | 亚洲99影视一区二区三区 | 日韩欧美精品中文字幕 | 国产羞羞视频在线观看 | 免费a网 | 成人永久免费 | 国产成人av一区二区 | 亚洲最新色 | 国产88久久久国产精品免费二区 | 免费一级在线视频 | 91免费国产视频 | 欧美三级短视频 | 欧美日本在线视频 | 国内精品视频饥渴少妇在线播放 | 国产亚洲精彩视频 | 国产精品色综合 | 免费观看又色又爽又黄的崩锅 | 国产一级毛片网站 | ,欧美特黄特色三级视频在线观看 | 欧美亚洲国产成人综合在线 | 成年人免费黄色片 | 91www成人久久 | 欧美成人一区二区视频 | 99久久久精品免费观看国产 | 成年人国产视频 | 国产精品爱久久久久久久 | 精品一区二区三区毛片 |