在 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 上的另一个问题复制而来的: