在常规的MVC控制器中,我们可以用a输出pdf FileContentResult.
public FileContentResult Test(TestViewModel vm)
{
var stream = new MemoryStream();
//... add content to the stream.
return File(stream.GetBuffer(), "application/pdf", "test.pdf");
}
Run Code Online (Sandbox Code Playgroud)
但是我们怎样才能把它变成一个ApiController?
[HttpPost]
public IHttpActionResult Test(TestViewModel vm)
{
//...
return Ok(pdfOutput);
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试过但它似乎不起作用.
[HttpGet]
public IHttpActionResult Test()
{
var stream = new MemoryStream();
//...
var content = new StreamContent(stream);
content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
content.Headers.ContentLength = stream.GetBuffer().Length;
return Ok(content);
}
Run Code Online (Sandbox Code Playgroud)
浏览器中显示的返回结果为:
{"Headers":[{"Key":"Content-Type","Value":["application/pdf"]},{"Key":"Content-Length","Value":["152844"]}]}
Run Code Online (Sandbox Code Playgroud)
在SO上有类似的帖子:从ASP.NET Web API中的控制器返回二进制文件 .它讨论输出现有文件.但我无法使用流.
有什么建议?
我需要转换为内存流的JSON 任意内容.这是我想要做的一个简单示例:
class Program
{
class TestClass { public int Test1;}
static void Main(string[] args)
{
var ms = new MemoryStream();
var writer = new StreamWriter(ms);
writer.Write(new TestClass());
writer.Flush();
ms.Position = 0;
var json = JsonConvert.SerializeObject(/*???*/, Formatting.Indented);
Console.Write(json);
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
不知道要传递给SerializeObject方法的内容.如果我传递MemoryStream(变量ms),我会收到一个错误:
Newtonsoft.Json.dll中发生未处理的"Newtonsoft.Json.JsonSerializationException"类型异常
附加信息:从'System.IO.MemoryStream'上的'ReadTimeout'获取值时出错.
是否可以序列化流的任意内容?
谢谢
我收到这个错误
ReadTimeout = '((System.IO.Stream)(ms)).ReadTimeout' threw an exception of type 'System.InvalidOperationException'.
Run Code Online (Sandbox Code Playgroud)
我的代码是。
byte[] imageBytes = Convert.FromBase64String(img);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); //Problem generates here//
Run Code Online (Sandbox Code Playgroud)
谢谢..