在 Web API 中访问 RAW XML 数据
Access the RAW XML data in Web API
我正在使用 Web API 接收 XML 数据并将其转换为对象。哪个工作正常。
public void Post([FromBody] trackermessages model)
{
try
{
如何获取 RAW XML 数据?有没有办法在请求开始时或在此操作中获取 XML 数据?
我试过这个:
public void Post([FromBody] trackermessages model, [FromBody] string rawText)
{
try
{
但这是不允许的。
我也试过这个:
public void Post([FromBody] trackermessages model)
{
try
{
var strean = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
但是我得到了异常:
This method or property is not supported after
HttpRequest.GetBufferlessInputStream has been invoked.
编辑:
我遇到异常:
var stream = await Request.Content.ReadAsStreamAsync();
stream.Seek(0, System.IO.SeekOrigin.Begin); // On this Line
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
是的,您可以获得原始 XML。您确实需要返回到流的开头,因为在处理模型时它将被读取到结尾。
public async void Post([FromBody]TestModel value)
{
var stream = await this.Request.Content.ReadAsStreamAsync();
stream.Seek(0, System.IO.SeekOrigin.Begin);
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Console.Write(text);
}
那么问题是您的应用程序正在使用 GetBufferlessInputStream 读取上传而不缓冲它们。虽然这对服务器上的内存使用有好处,但这意味着一旦您读取了流,它将不再可用。
填充您的模型时,您的流正在被这样读取。默认情况下使用 GetBufferedInputStream,这就是它对我有用的原因。
我建议您将原始 XML 作为操作的输入,然后手动反序列化到模型中。或者,您可以切换回接受已发布的数据到缓冲区中。
您可能按照这样的操作将其打开:https://blogs.msdn.microsoft.com/kiranchalla/2012/09/04/receiving-request-file-or-data-in-streamed-mode-at-a-web-api-service/ 并且应该撤消它以将其关闭。
我就是这样做的,因为我必须读取 RAW 数据然后转换为对象:
public void Post(HttpRequestMessage request)
{
// Reading data as XML string to log to files - In case message structure is changed
var xmlDoc = new XmlDocument();
xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
var str = xmlDoc.InnerXml;
// Convert to model
var model = XMLHelper.FromXml<trackermessages>(str);
}
XMLHelper
是从 Whosebug 上的另一个问题复制而来的:
我正在使用 Web API 接收 XML 数据并将其转换为对象。哪个工作正常。
public void Post([FromBody] trackermessages model)
{
try
{
如何获取 RAW XML 数据?有没有办法在请求开始时或在此操作中获取 XML 数据?
我试过这个:
public void Post([FromBody] trackermessages model, [FromBody] string rawText)
{
try
{
但这是不允许的。
我也试过这个:
public void Post([FromBody] trackermessages model)
{
try
{
var strean = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
但是我得到了异常:
This method or property is not supported after HttpRequest.GetBufferlessInputStream has been invoked.
编辑:
我遇到异常:
var stream = await Request.Content.ReadAsStreamAsync();
stream.Seek(0, System.IO.SeekOrigin.Begin); // On this Line
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
是的,您可以获得原始 XML。您确实需要返回到流的开头,因为在处理模型时它将被读取到结尾。
public async void Post([FromBody]TestModel value)
{
var stream = await this.Request.Content.ReadAsStreamAsync();
stream.Seek(0, System.IO.SeekOrigin.Begin);
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Console.Write(text);
}
那么问题是您的应用程序正在使用 GetBufferlessInputStream 读取上传而不缓冲它们。虽然这对服务器上的内存使用有好处,但这意味着一旦您读取了流,它将不再可用。
填充您的模型时,您的流正在被这样读取。默认情况下使用 GetBufferedInputStream,这就是它对我有用的原因。
我建议您将原始 XML 作为操作的输入,然后手动反序列化到模型中。或者,您可以切换回接受已发布的数据到缓冲区中。 您可能按照这样的操作将其打开:https://blogs.msdn.microsoft.com/kiranchalla/2012/09/04/receiving-request-file-or-data-in-streamed-mode-at-a-web-api-service/ 并且应该撤消它以将其关闭。
我就是这样做的,因为我必须读取 RAW 数据然后转换为对象:
public void Post(HttpRequestMessage request)
{
// Reading data as XML string to log to files - In case message structure is changed
var xmlDoc = new XmlDocument();
xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
var str = xmlDoc.InnerXml;
// Convert to model
var model = XMLHelper.FromXml<trackermessages>(str);
}
XMLHelper
是从 Whosebug 上的另一个问题复制而来的: