.net core 3.1 中間件或過濾器中讀取post請求body方法/ ParseQueryString 轉 NameValueCollection 類型


 

代碼如下://Get請求 ParseQueryString  轉為 NameValueCollection 
NameValueCollection form = HttpUtility.ParseQueryString(context.HttpContext.Request.QueryString.ToString());

string data = string.Empty;
switch (method)
{
case "POST":
request.Body.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(request.Body, Encoding.UTF8))
{
data = reader.ReadToEnd();
}
break;
case "GET":
//第一步:取出所有get參數
IDictionary<string, string> parameters = new Dictionary<string, string>();
for (int f = 0; f < form.Count; f++)
{
string key = form.Keys[f];
parameters.Add(key, form[key]);
}

 
         

// 第二步:把字典按Key的字母順序排序
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

 
         

// 第三步:把所有參數名和參數值串在一起
StringBuilder query = new StringBuilder();
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key))
{
query.Append(key).Append(value);
}
}
data = query.ToString();
break;
default:

 
         

base.OnActionExecuting(context);
return;
}

 
        

post請求 body 獲取數據為空 

解決方法  在站點啟動時設置以插入中間件的方式啟用EnableBuffering,以達到在全局多次讀取的目的。

在 Startup 文件  Configure 中 加入  代碼如下: 進行注冊

 app.Use(next => context =>
      {
            context.Request.EnableBuffering();
            return next(context);
      });

此外,3.0中默認禁用了AllowSynchronousIO,同步讀取body的方式需要ConfigureServices中配置允許同步讀取IO流,否則可能會拋出異常 Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.
根據使用的托管的服務進行配置或直接使用異步讀取方式。

services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true)
                .Configure<IISServerOptions>(x=>x.AllowSynchronousIO = true);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM