Pau*_*ulR 3 c# azure-storage asp.net-web-api
我试图从我的REST API返回一个pdf文件,并将ReportController添加到我的控制器集合中,如下所示.
public class ReportController : ApiController
{
public HttpResponseMessage Get(int id)
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
string fileName = id.ToString();
MemoryStream memoryStream = GetStreamFromBlob(fileName);
result.Content = new ByteArrayContent(memoryStream.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
其他控制器都可以正常工作,但这是第一个设置为返回HttpResponseMessage而不是可序列化对象或对象集合的控制器.
但是我很难从客户端消费这个.已经尝试了许多版本的代码来执行此操作,但是控制器代码永远不会受到影响,并且似乎很少有成功的方法来调用它.以下是我目前的版本: -
public async Task<string> GetPdfFile(int id)
{
string fileName = string.Format("C:\\Code\\PDF_Client\\{0}.pdf", id);
using (HttpClient proxy = new HttpClient())
{
string url = string.Format("http://localhost:10056/api/report/{0}", id);
HttpResponseMessage reportResponse = await proxy.GetAsync(url); //****
byte[] b = await reportResponse.Content.ReadAsByteArrayAsync();
System.IO.File.WriteAllBytes(fileName, b);
}
return fileName;
}
Run Code Online (Sandbox Code Playgroud)
但是该行****失败并显示消息No connection could be made because the target machine actively refused it 127.0.0.1:10056.
正如我所说,其他控制器在http://localhost:10056/api/工作正常.
这是从WEBAPI服务器方法获取文件的正确方法吗?
您是否对代码中可能更好的其他区域有任何建议,例如使用await/async,或者控制器返回文件的更好方法?
小智 5
我遇到了同样的问题,希望将PDF写入ApiController动作的输出.
这个链接帮助我:http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
我编写了自己的MediaTypeFormatter,用于从字节数组中编写PDF.
public class PdfFormatter : MediaTypeFormatter
{
#region Constants and Fields
private const int ChunkSizeMax = 1024 * 10;
#endregion
#region Constructors and Destructors
public PdfFormatter()
{
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/pdf"));
}
#endregion
#region Public Methods
public override bool CanReadType(Type type)
{
return false; // can't read any types
}
public override bool CanWriteType(Type type)
{
return type == typeof(byte[]);
}
public override Task WriteToStreamAsync(
Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
Task t = new Task(() => WritePdfBytes(value, writeStream));
t.Start();
return t;
}
#endregion
#region Methods
private static void WritePdfBytes(object value, Stream writeStream)
{
byte[] buffer = value as byte[];
int offset = 0;
while (offset < buffer.Length)
{
int chunkSize = Math.Min(buffer.Length - offset, ChunkSizeMax);
writeStream.Write(buffer, offset, chunkSize);
offset += chunkSize;
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
然后,我在Global.asax中注册了这个格式化程序,如下所示:
private void SetupFormatters()
{
GlobalConfiguration.Configuration.Formatters.Add(new PdfFormatter());
}
Run Code Online (Sandbox Code Playgroud)
我的ApiController Get方法的相关部分如下所示:
public HttpResponseMessage Get(string url, string title)
{
byte[] pdfBytes;
/* generate the pdf into pdfBytes */
string cleanTitle = new Regex(@"[^\w\d_-]+").Replace(title, "_");
string contentDisposition = string.Concat("attachment; filename=", cleanTitle, ".pdf");
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, pdfBytes, MediaTypeHeaderValue.Parse("application/pdf"));
response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition);
return response;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8300 次 |
| 最近记录: |