在 Web 浏览器中显示内存流的内容

本文关键字:内存 显示 Web 浏览器 | 更新日期: 2023-09-27 17:57:17

我正在做一个MVC项目,该项目创建了一个用于XSLT转换的内存流。最后,我想在任何 Web 浏览器上显示转换的结果。以下是正在创建的内存流。

       XslCompiledTransform xsl = new XslCompiledTransform();
       xsl.Load(xsltpath);    
       MemoryStream stream = new MemoryStream();
       XmlWriter xmlWriter = XmlWriter.Create(stream);
       xsl.Transform(InputMessagePath, xmlWriter);
       xmlWriter.Close();
       // Pass or set the content of stream as a string or any other compatible type to the view to diplay
       stream.Close();

是否可以在 Web 浏览器中显示内存流的内容?如果不可能,最好的方法是什么?我正在考虑创建临时文件并将其路径作为参数传递给System.Diagnostics.Process.Start(path)。但在此之前,最好知道使用 stream 对象而不是创建文件以在 Web 浏览器中显示内容的可能性。谢谢。

在 Web 浏览器中显示内存流的内容

返回"FileResult"并在响应中设置内容类型:

您可以在此处找到文档:

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file%28v=vs.118%29.aspx

存在需要流的过载。

返回文件(流,"文本/html;字符集=UTF-8");

感谢您的回复。只是认为如果我发布我的实现,这对某人有用。

以下是我用于显示内存流内容的过程。我的要求是获取 XSLT 转换的编码 html 内容并在浏览器中显示。以下内容并不完全是我实现的。我简化了它以演示上述要求。

-------------型----------------------------------------

public class MyModel
 {
    public string EncodedOutputMessage { get; set; }
    Public Transform()
    {
        // Do something
        SetTransformResult(xsl, intputMsgPath);
    }
    private void SetTransformResult(XslCompiledTransform xsl, string intputMsgPath)
    {
        MemoryStream stream = new MemoryStream();
        XmlWriter xmlWriter = XmlWriter.Create(stream);
        xsl.Transform(intputMsgPath, xmlWriter);
        xmlWriter.Close();
        XmlDocument root = new XmlDocument();
        stream.Position = 0; // rewind the pointer to the beginning of the stream
        root.Load(stream);
        XmlNodeList nodes = root.GetElementsByTagName("BodyXhtml");
        if (nodes.Count == 1)
        {
            EncodedOutputMessage = HttpUtility.HtmlEncode(nodes[0].InnerXml);
        }
        stream.Close();
    }
}

--------------控制器-----------------------------------

public class MyTestController : Controller
{   
    [HttpPost]
    public ActionResult ShowResult()
    {
        MyModel model = new MyModel();
        model.Transform();
        ViewBag.DecodedOutputMessage = HttpUtility.HtmlDecode(model.EncodedOutputMessage);
        return View("MyView");
    }
}

----- 我的视图--------------------------------------------------------------

@model Tester.Models.MyModel
// Other fields to display
@Html.Raw(ViewBag.DecodedOutputMessage);

操作方法执行转换并获取编码的字符串,然后对其进行解码并将其发送到视图。我已经删除了大多数方法来简化此过程。

如果没有要在浏览器中显示的任何其他内容,则只能传递 HTML 字符串,如下所示。

 public string Result()
    {
        string htmlRes = "<html><body><font color='"red'"> Testing color... </font></body></html>";
        return htmlRes ;
    }

我这样做:

MemoryStream stream = new MemoryStream(System.Text.UTF8Encoding.Default.GetBytes(xml));
XPathDocument document = new XPathDocument(stream);
StringWriter writer = new StringWriter();
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(Server.MapPath("~/NFCe.xsl"));
transform.Transform(document, null, writer);
Response.Write(writer.ToString());

XML 结果将发送到客户端。在这种情况下,我有一个变量"xml"和我的原始 xml,他们正在应用包含在文件 NFCE.xsl 中的转换。Response.Write 将字符串写入输出流,该字符串将发送到客户端,而不是呈现的 aspx。