Serialization 如何在.NET Core 3.1或.NET标准中反序列化x-www-form-urlencoded字符串?

Serialization 如何在.NET Core 3.1或.NET标准中反序列化x-www-form-urlencoded字符串?,serialization,.net-core,x-www-form-urlencoded,Serialization,.net Core,X Www Form Urlencoded,如何在.NET Core 3.1或.NET标准(C#)中反序列化x-www-form-urlencoded字符串 我知道这一点。但是,FormDataCollection在.NET Core 3.1中似乎不可用 编辑:另一个外部系统正在将此编码数据传回我。我不是在写ASP.NET核心网站/API。所以我从来没有找到这个问题的简洁答案。所以我敲出了自己的粗略的连载程序。张贴在这里,以防任何人从中得到任何使用。我仍然欢迎更好的答案!:-) 使用系统; 使用System.Net.Http; 使用Sys

如何在.NET Core 3.1或.NET标准(C#)中反序列化x-www-form-urlencoded字符串

我知道这一点。但是,FormDataCollection在.NET Core 3.1中似乎不可用


编辑:另一个外部系统正在将此编码数据传回我。我不是在写ASP.NET核心网站/API。

所以我从来没有找到这个问题的简洁答案。所以我敲出了自己的粗略的连载程序。张贴在这里,以防任何人从中得到任何使用。我仍然欢迎更好的答案!:-)

使用系统;
使用System.Net.Http;
使用System.Threading.Tasks;
使用System.Collections.Generic;
利用制度全球化;
使用System.Linq;
运用系统反思;
公共静态类FormUrlEncodedSerializer
{
公共静态异步任务序列化异步(对象obj)
{
if(obj==null)
抛出新ArgumentNullException(nameof(obj));
var keyValues=obj.GetPropertiesAsDictionary();
var formUrlEncodedContent=新的formUrlEncodedContent(keyValues);
return wait formUrlEncodedContent.ReadAsStringAsync();
}
公共静态T反序列化(字符串formUrlEncodedText),其中T:new()
{
if(string.IsNullOrEmpty(formUrlEncodedText))
抛出新ArgumentException(“表单URL编码文本为null或空。”,nameof(formUrlEncodedText));
var pairs=formUrlEncodedText.Split('&');
var obj=新的T();
foreach(成对变量对)
{
var nameValue=pair.Split('=');
if(HasValue(nameValue))
{
obj.SetProperty(nameValue[0],nameValue[1]);
}
}
返回obj;
}
私有静态bool HasValue(字符串[]nameValue)
{
返回nameValue.Length==2&&nameValue[1]!=string.Empty;
}
}
公共静态类对象扩展
{
公共静态void SetProperty(此对象源、字符串propertyName、对象propertyValue)
{
var pi=source.GetProperty(propertyName);
if(pi!=null&&pi.CanWrite)
{
pi.SetValue(源,propertyValue,null);
}
}
公共静态属性Info GetProperty(此对象源,字符串propertyName)
{
BindingFlags BindingFlags=BindingFlags.Public | BindingFlags.Instance;
返回source.GetType().GetProperty(propertyName,bindingFlags);
}
公共静态IDictionary GetPropertiesAsDictionary(此对象源)
{
var dict=新字典();
if(source==null)
返回命令;
var properties=source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach(属性中的var属性)
{
var value=property.GetValue(源);
如果(值==null)
继续;
dict.Add(property.Name,value.ToString());
}
返回命令;
}
}
编辑:将tokyValue替换为GetPropertiesAsDictionary。

您可以与所有.NET核心版本一起使用

var参数=新字典()
{
{“param1”,“value1”},
{“param2”,JsonConvert.SerializeObject(value2)},
};
var query=new FormUrlEncodedContent(参数).ReadAsStringAsync().Result;

您尝试过什么?在期待答案之前,请先表现出努力。我主要是问FormDataCollection在.NET Core 3.1中的位置,或者.NET Core 3.1中的替代方案是什么。你最终找到了答案吗?没有。但我确实为此编写了自己的序列化程序。有点粗糙,但我会给出答案shortly@gabrielthursday我已经进一步清理了这个问题,并将其添加到我的一个nuget包中:ByteDev.Http()。使用简单引用:ByteDev.Http.FormUrlEncoded.Serialization.FormUrlEncodedSerializer