C# 为什么Web Api(.Net Core)总是返回JSON并忽略ContentType中的值?

C# 为什么Web Api(.Net Core)总是返回JSON并忽略ContentType中的值?,c#,asp.net-web-api,asp.net-web-api2,asp.net-core-webapi,C#,Asp.net Web Api,Asp.net Web Api2,Asp.net Core Webapi,我有两个web API,它们有完全相同的代码和相同的引用 第一个项目(称为项目A)在.NET4.6下运行,是旧的WebAPI项目 第二个项目(称为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.Ne

我有两个web API,它们有完全相同的代码和相同的引用

  • 第一个项目(称为项目A)在.NET4.6下运行,是旧的WebAPI项目
  • 第二个项目(称为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;


}
当我调用它们(从另一个控制器或浏览器)时,它们会产生两种不同的结果

  • 项目A返回正确响应标题为application/Pdf的Pdf文件
  • 项目B总是返回Json(application/Json)格式,不管我在响应头中设置了什么。我尝试过xml、文本、流、ByteArray。什么都不管用
我的问题是:

  • 到底发生了什么事?微软是不是又来了
  • 我能为项目B做些什么来返回正确的响应(如我所定义的)
这是我的web.config文件

项目B:模板中的默认值(我无法将其粘贴到此处,不确定原因)


项目A:默认模板(我无法将其粘贴到此处,不确定原因)

asp.net-core默认不支持
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");
    }            
}  

您必须发送带有正确值的
accept
标题。请共享工作api项目中的WebApiConfig.cs各位,这是我的Web.config
抱歉,我无法在stackoverflow上格式化xml内容。基本上,我使用了默认的web.config。没有修改。@Dr.Fre您介意澄清一下您的评论吗?我不太清楚怎么做?但是为什么我需要在.netcore(target.NET4.6)项目中这样做呢