c# – ASP NET核心修改替换请求体

c# – ASP NET核心修改替换请求体,第1张

概述我需要替换HttpContext.Request.Body. 我试过在中间件中做这件事 public async Task Invoke(HttpContext context) { if (context.Request.Path.Value.Contains("DataSourceResult")) { var originalB 我需要替换httpContext.Request.Body.

我试过在中间件中做这件事

public async Task Invoke(httpContext context)    {        if (context.Request.Path.Value.Contains("DataSourceResult"))        {            var originalBody = new StreamReader(context.Request.Body).ReadToEnd();            DataSourceRequest dataSource = null;            try            {                dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalBody);            } catch            {                await _next.Invoke(context);            }            if (dataSource != null && dataSource.Take > 2000)            {                dataSource.Take = 2000;                var bytesToWrite = dataSource.AsByteArray();                await context.Request.Body.WriteAsync(bytesToWrite,bytesToWrite.Length);            }            else            {                var bytesToWrite = originalBody.AsByteArray();                await context.Request.Body.WriteAsync(bytesToWrite,bytesToWrite.Length);            }        }        await _next.Invoke(context);    }

第一个问题是主体只能读取一次,第二个问题是流是只读的,不能写入.
如何修改/替换request.body(我需要更改请求体的属性值)?

解决方法 获取请求正文,读取它的内容,根据需要进行必要的更改,然后创建一个新流以传递管道.访问后,必须替换请求流.
public async Task Invoke(httpContext context) {    var request = context.Request;    if (request.Path.Value.Contains("DataSourceResult")) {        //get the request body and put it back for the downstream items to read        var stream = request.Body;// currently holds the original stream                            var originalContent = new StreamReader(stream).ReadToEnd();        var notModifIEd = true;        try {            var dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalContent);            if (dataSource != null && dataSource.Take > 2000) {                dataSource.Take = 2000;                var Json = JsonConvert.SerializeObject(dataSource);                //replace request stream to downstream handlers                var requestContent = new StringContent(Json,EnCoding.UTF8,"application/Json");                stream = await requestContent.ReadAsstreamAsync();//modifIEd stream                notModifIEd = false;            }        } catch {            //No-op or log error        }        if (notModifIEd) {            //put original data back for the downstream to read            var requestData = EnCoding.UTF8.GetBytes(originalContent);            stream = new MemoryStream(requestData);        }        request.Body = stream;    }    await _next.Invoke(context);}
总结

以上是内存溢出为你收集整理的c# – ASP NET核心修改/替换请求体全部内容,希望文章能够帮你解决c# – ASP NET核心修改/替换请求体所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1250471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存