Azure Functions - 为响应消息设置MediaTypeFormatter?

时间:2017-12-04 19:22:35

标签: azure-functions mediatypeformatter

我正在尝试为Azure功能的响应设置媒体类型格式化程序以返回Excel文件。我不想要外部文件绑定,因为我想将输出流式传输到浏览器进行下载,而不是将文件写入blob或google工作表等。在其他环境(例如WebApi)之前,我已经为此目的使用了EPPlus库和WebApiContrib.Formatting.Xlsx。我能够导入包并在我的函数中引用它们,但是我无法成功添加格式化程序并将其应用于响应。

是否可以获取对HttpConfiguration对象的引用以添加格式化程序?我尝试将XlsxMediaTypeFormatter添加到CreateResponse调用,但由于某种原因,它无法强制转换为MediaTypeFormatter。如果我只是尝试设置MIME类型,它表示没有可用的格式化程序。

这是我的测试功能:

using System.Net;
using System.Net.Http.Headers;
using System.Net.Http.Formatting;
using WebApiContrib.Formatting.Xlsx;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{

    var testData = new List<TestItemDto>
    {
        new TestItemDto
        {
            Id = System.Guid.NewGuid().ToString(), 
            Name = "Test Item 1" 
        }, 
        new TestItemDto
        {
            Id = System.Guid.NewGuid().ToString(), 
            Name = "Test Item 2" 
        }
    };

    //var excelMediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    var formatter = new XlsxMediaTypeFormatter(headerHeight: 25f, freezeHeader: true);

    var response = req.CreateResponse<List<TestItemDto>>(HttpStatusCode.OK, testData, (MediaTypeFormatter)formatter);
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "TestData.xlsx"
    };
    return response;
}

public class TestItemDto
{
    public string Id { get; set; }
    public string Name { get; set; }
}

我收到错误:

error CS0030: Cannot convert type 'WebApiContrib.Formatting.Xlsx.XlsxMediaTypeFormatter' to 'System.Net.Http.Formatting.MediaTypeFormatter'

我的project.json文件:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "EPPlus": "3.1.3.3", 
        "WebApiContrib.Formatting.Xlsx" : "1.0.1"
      }
    }
   }
}

1 个答案:

答案 0 :(得分:0)

这不是最佳答案,因为它绕过MediaTypeFormatter并直接创建响应内容。但是,我能够通过抛弃XlsxMediaTypeFormatter,直接使用EPPlus库创建excel工作簿,并将其流式传输到浏览器(使用与上面相同的DTO和测试集合)来实现它:

UIVisualEffectView

如果有人能回答实际问题(例如如何使用MediaTypeFormatter),我会保留问题。