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

时间:2014-04-07 20:56:38

标签: c# asp.net-mvc xslt stream

我正在开发一个MVC项目,该项目创建一个用于XSLT Transform的内存流。最后,我想在任何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)。但在此之前,了解使用流对象而不是创建文件以在Web浏览器中显示内容的可能性会很棒。 谢谢。

3 个答案:

答案 0 :(得分:1)

你返回一个' FileResult'并在响应中设置content-type:

您可以在此处找到文档:

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

过载需要一个流。

return File(stream," text / html; charset = utf-8");

答案 1 :(得分:1)

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

以下是我用来显示内存流内容的过程。我的要求是获取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();
    }
}

-------------- Controller -------------------------------- ---

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

----- MyView ----------------------------------------- ---------------------

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

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

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

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

答案 2 :(得分:0)

我这样做:

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。