【发布时间】:2019-05-18 10:48:43
【问题描述】:
我有一个 .Net Core(2.1) Web API,它必须适应现有的 .Net framework(4.6.2) 系统,并且现有系统发送 Api 接受的请求。
这就是问题所在。在.Net框架系统中,调用api是这样的:
var request = (HttpWebRequest)WebRequest.Create("http://xxx.xxx/CloudApi/RegionsList");
request.KeepAlive = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "*/*";
var data = new Person()
{
Name = "Alex",
Age = 40
};
byte[] dataBuffer;
using (MemoryStream ms = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, data);
dataBuffer = ms.GetBuffer();
}
request.ContentLength = dataBuffer.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(dataBuffer, 0, dataBuffer.Length);
requestStream.Close();
try
{
var response = (HttpWebResponse)request.GetResponse();
Console.WriteLine("OK");
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
这里是api控制器代码:
[Route("cloudapi")]
public class LegacyController : ControllerBase
{
[HttpPost]
[Route("regionslist")]
public dynamic RegionsList([FromBody]byte[] value)
{
return value.Length;
}
}
人物类:
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
根据这篇文章:Accepting Raw Request Body Content in ASP.NET Core API Controllers
我已经制作了一个自定义的 InputFormatter 来处理这种情况:
public class RawRequestBodyFormatter : IInputFormatter
{
public RawRequestBodyFormatter()
{
}
public bool CanRead(InputFormatterContext context)
{
if (context == null) throw new ArgumentNullException("argument is Null");
var contentType = context.HttpContext.Request.ContentType;
if (contentType == "application/x-www-form-urlencoded")
return true;
return false;
}
public async Task<InputFormatterResult> ReadAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
var contentType = context.HttpContext.Request.ContentType;
if (contentType == "application/x-www-form-urlencoded")
{
using (StreamReader reader = new StreamReader(request.Body, Encoding.UTF8))
{
using (var ms = new MemoryStream(2048))
{
await request.Body.CopyToAsync(ms);
var content = ms.ToArray();
return await InputFormatterResult.SuccessAsync(content);
}
}
}
return await InputFormatterResult.FailureAsync();
}
}
但是我发现我发送的数据(Person类实例)不在request.Body中,而是在request.Form中,无法反序列化Form。
非常感谢任何帮助。
【问题讨论】:
-
我想知道你为什么需要阅读原始的
byte[]? -
@itminus 需要转换成我无法更改的现有客户端(旧的.Net框架系统)通过http请求传递的对象。
标签: c# asp.net-mvc asp.net-web-api asp.net-core