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);
我正在尝试使用 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);