2017-12-04 11 views
0

Azure 함수 응답에 대한 미디어 형식 포맷터를 설정하여 Excel 파일을 반환하려고합니다. 외부 파일 바인딩을 원하지 않습니다. 다운로드를 위해 브라우저로 출력을 스트리밍하고 BLOB 또는 Google 시트 또는 기타 파일에 파일을 쓰지 않으려 고합니다. 다른 목적 (예 : WebApi)에서는이 목적으로 EPPlus 라이브러리와 WebApiContrib.Formatting.Xlsx를 사용했습니다. 패키지를 가져 와서 함수에서 참조 할 수 있었지만 성공적으로 포매터를 추가하고 응답에 적용 할 수 없었습니다.Azure 함수 - 응답 메시지에 MediaTypeFormatter를 설정 하시겠습니까?

포맷터를 추가하는 함수에 대해 HttpConfiguration 객체에 대한 참조를 가져올 수 있습니까? CreateResponse 호출에 XlsxMediaTypeFormatter를 추가하려했지만 어떤 이유로 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" 
     } 
    } 
    } 
} 
+0

어셈블리 버전이 일치하지 않지만 아직 어디에서 볼 수없는 것 같습니다. 'csproj' 프리 컴파일 함수를 사용하여 동일한 코드를 로컬에서 실행할 수 있습니까? 나를 위해 일하는 것 같아 ... – Mikhail

+0

나는 로컬로 시도하고 XlsxMediaTypeFormatter를 인스턴스화 런타임 오류 (null 참조)있어. 분명히 그 라이브러리는 (WebApi에서 사용하도록 설계된) 함수에서 작동하지 않을 것입니다. 미디어 유형을 설정하고 함수에서 브라우저로 파일을 반환하는 다른 솔루션을 찾고 있습니다. EPPlus 라이브러리를 사용하여 파일을 생성 한 다음 응답 내용으로 직접 스트리밍하려고합니다. – emaia

답변

0

, MediaTypeFormatter를 우회하여 응답 내용을 직접 생성하기 때문입니다.

// try to create an excel file by hand with EPPlus 
ExcelPackage pck = new ExcelPackage(); 
var wsTest = pck.Workbook.Worksheets.Add("TestSheet"); 
//Load the collection starting from cell A1... 
wsTest.Cells["A1"].LoadFromCollection(testData, true); 
wsTest.Cells[wsTest.Dimension.Address].AutoFitColumns(); 

var excelMediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

var response = req.CreateResponse(HttpStatusCode.OK); 
response.Content = new StreamContent(new MemoryStream(pck.GetAsByteArray())); 
response.Content.Headers.ContentType = new MediaTypeHeaderValue(excelMediaType); 
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
     FileName = "TestData.xlsx" 
}; 
return response; 

: 그러나, 나는 (동일한 DTO 위와 같이 테스트 모음을 사용하여) EPPlus 라이브러리를 직접 Excel 통합 문서를 창조하는 XlsxMediaTypeFormatter 죽겠다하고 브라우저로 스트리밍 작업을 얻을 수 있었다 누군가가 실제 질문에 답할 수 있도록 질문을 공개하겠습니다 (예 : MediaTypeFormatter 사용 방법).