return html 来自 .Net Core 的文件 api

return html file from .Net Core api

我正在尝试使用 this and this 获取 html 文件作为输出,但得到 error 500

我的app的objective是基于api请求的,服务器会将请求的输出生成为html文件,发送给用户请求。

使用的代码是:

using Microsoft.AspNetCore.Mvc;  // for Controller, [Route], [HttpPost], [FromBody], JsonResult and Json
using System.IO;   // for MemoryStream
using System.Net.Http; // for HttpResponseMessage
using System.Net;  // for HttpStatusCode
using System.Net.Http.Headers;  // for MediaTypeHeaderValue

namespace server{
    [Route("api/[controller]")]
    public class FileController : Controller{
    [HttpGet]
    public HttpResponseMessage Get()
    {
        string r = @" 
            Hello There
        ";
        var stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(r);
        writer.Flush();
        stream.Position = 0;

       // processing the stream.
       byte[] Content = convert.StreamToByteArray(stream);
       var result = new HttpResponseMessage(HttpStatusCode.OK);


        result.Content.Headers.ContentDisposition =
            new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
        {
            FileName = "welcome.html"
        };
        result.Content.Headers.ContentType =
            new MediaTypeHeaderValue("application/octet-stream");

        return result;
    }
  }
}

和:

using System.IO;  // for MemoryStream

namespace server{
    class convert{
            public static byte[] StreamToByteArray(Stream inputStream)
            {
                byte[] bytes = new byte[16384];
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    int count;
                    while ((count = inputStream.Read(bytes, 0, bytes.Length)) > 0)
                    {
                        memoryStream.Write(bytes, 0, count);
                    }
                    return memoryStream.ToArray();
                }
            }
    }
}

我需要返回的结果是一个 .html 文件,这样我就可以在新的浏览器中打开它 window 使用 JavaScript 就像 var a = window.open(returnedFile, "name");

通过 api return 一个 html 页面,您可以使用 HttpResponseMessage 并将内容类型设置为“text/html”。 问题是 .net core 默认不支持 HttpResponseMessage 响应。

步骤 1

要启用来自 Web api 方法的响应类型,请按照 的精彩回答中的步骤进行操作。

步骤 2

将以下方法应用到控制器

[HttpGet]
public HttpResponseMessage Get()
{
    string responseString = @" 
        Hello There
    ";
    var response = new HttpResponseMessage();
    response.Content =  new StringContent(responseString);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
    return response;
}

步骤 3

直接在window.open方法中调用api,默认情况下会在新的window(_blank)

中打开自己
window.open('http://localhost:2222/api/file')

感谢@Marcus-h 的反馈和回答,我通过使用 [Produces("text/html")] 并将 return 设为 string 解决了这个问题,所以完整代码是:

namespace server{
    [Route("api/[controller]")]
    public class FileController : Controller{
        [HttpGet]
        [Produces("text/html")]
        public string Get()
        {
            string responseString = @" 
            <title>My report</title>
            <style type='text/css'>
            button{
                color: green;
            }
            </style>
            <h1> Header </h1>
            <p>Hello There <button>click me</button></p>
            <p style='color:blue;'>I am blue</p>
            ";
            return responseString;
        }
    }
}

为了在浏览器中打开它 window,我使用了:

var report = window.open('', 'myReport', 'location=no,toolbar=0');
// or var report = window.open(''); // if I need the user to be able to use the browser actions, like history
report.document.title = 'My report';  // if title not added in the server code
fetch('http://localhost:60000/api/File', {
       method: 'get'
      })
      .then(function(response) {
            return response.text();
      }).then(function(text) { 
            report.document.body.innerHTML = text;
      });

对于 .NET Core 2 API 你可以使用这个

return Content(html, "text/html", Encoding.UTF8);