2017-05-28 112 views
1

我有2個Web API,它們具有完全相同的代碼和相同的引用。爲什麼Web Api(.Net Core)總是返回JSON而忽略ContentType中的值?

  • 第一個(名爲Project A)在.NET 4.6中運行,是舊的Web API項目
  • 第二個(名爲Project B)在.NET 4.6太運行,但新的.NET的核心web api項目。

我用同樣的參考如下

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Web; 
using System.Web.Http; 
using PdfSharp.Drawing; 
using PdfSharp.Pdf; 

這裏是它們都使用的代碼。

public HttpResponseMessage TestReport() 
{ 
    HttpResponseMessage response; 

    PdfDocument document = HelloWorld(); 

    using (MemoryStream memoryStream = new MemoryStream()) { 
     document.Save(memoryStream, false); 


     byte[] buffer = memoryStream.GetBuffer(); 
     var contentLength = buffer.Length; 
     response = new HttpResponseMessage(HttpStatusCode.OK); 

     // Byte Array Test 
     //response.Content = new ByteArrayContent(buffer); 
     //response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
     //response.Content.Headers.ContentLength = contentLength; 
     //response.Content.Headers.ContentDisposition.FileName = "anything.pdf"; 
     //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 


     //var test = response.Content.ReadAsStreamAsync(); 

     // Stream Content Test 
     response.Content = new StreamContent(new MemoryStream(buffer)); 
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
     response.Content.Headers.ContentLength = contentLength; 
     ContentDispositionHeaderValue contentDisposition = null; 
     if (ContentDispositionHeaderValue.TryParse("attachment; filename=" + "helloWorld" + ".pdf", out contentDisposition)) { 
      response.Content.Headers.ContentDisposition = contentDisposition; 
     } 

     return response; 
    }; 
} 

public PdfDocument HelloWorld() 
{ 
    // Create a new PDF document 
    PdfDocument document = new PdfDocument(); 
    document.Info.Title = "Created with PDFsharp"; 

    // Create an empty page 
    PdfPage page = document.AddPage(); 

    // Get an XGraphics object for drawing 
    XGraphics gfx = XGraphics.FromPdfPage(page); 

    //XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always); 

    // Create a font 
    XFont font = new XFont("Times New Roman", 20, XFontStyle.BoldItalic); 

    // Draw the text 
    gfx.DrawString("Hello, World!", font, XBrushes.Black, 
     new XRect(0, 0, page.Width, page.Height), 
     XStringFormats.Center); 

    // Save the document... 
    const string filename = "HelloWorld_tempfile.pdf"; 
    //document.Save(filename); 
    return document; 


} 

當我打電話給他們(無論是從另一控制器或從瀏覽器),它們產生2個不同的結果

  • 項目A返回與正確的響應報頭的PDF文件是應用/ PDF
  • 項目B總是返回Json(application/json)格式,這與我在響應頭文件中設置的內容無關。我已經嘗試過XML,文本,流,bytearrays。什麼都沒有

我的問題是:

  • 究竟發生了什麼事?是微軟@#%^ &它呢?
  • 什麼我可以爲項目B沒有返回正確的響應(如我所定義)

P/S:這是我的web.config文件

項目B:從模板默認(我不能將其粘貼在這裏,不知道爲什麼)

項目A:從默認模板(我可以在這裏不糊,不知道爲什麼)

+0

你必須用正確的值發送'accept'頭。 – NtFreX

+0

請從工作api項目 –

+0

分享WebApiConfig.cs嗨,大家好,這是我的Web.config'<?xml version =「1.0」encoding =「utf-8」?> <! - 在appsettings.json中配置您的應用程序設置。瞭解更多http://go.microsoft.com/fwlink/?LinkId=786380 - > <添加名稱= 「aspNetCore」 路徑= 「*」 動詞= 「*」 modules =「AspNetCoreModule」resourceType =「Unspecified」/> ' –

回答

1

asp.net核心默認不,這是從以前的支持HttpResponseMessage Web API的版本。 Core將動作結果中的HttpResponseMessage視爲模型,並將其序列化爲JSON。

重構項目B的代碼...

public IActionResult TestReport() {   
    var document = HelloWorld(); 
    using (var memoryStream = new MemoryStream()) { 
     document.Save(memoryStream, false); 
     var buffer = memoryStream.GetBuffer(); 
     var contentDisposition = new ContentDispositionHeaderValue("attachment"); 
     contentDisposition.SetHttpFileName("helloWorld.pdf"); 
     Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString(); 
     return File(buffer, "application/pdf"); 
    }    
} 
相關問題