Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从web api控制器返回文件?_C#_Json_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# 如何从web api控制器返回文件?

C# 如何从web api控制器返回文件?,c#,json,asp.net-mvc,asp.net-web-api,C#,Json,Asp.net Mvc,Asp.net Web Api,我正在使用MVC 5 web Api控制器,我想返回一个文件: [Route("")] public HttpResponseMessage GetFile() { var statusCode = HttpStatusCode.OK; FileStream file = XLGeneration.XLGeneration.getXLFileExigence(); return Request.CreateResponse(statusCode, file); } 它

我正在使用MVC 5 web Api控制器,我想返回一个文件:

[Route("")]
public HttpResponseMessage GetFile()
{
    var statusCode = HttpStatusCode.OK;
    FileStream file = XLGeneration.XLGeneration.getXLFileExigence();

    return Request.CreateResponse(statusCode, file);
}
它不起作用

邮递员的例外情况是:

“ExceptionMessage”:“ObjectContent'1'类型未能序列化内容类型'application/json;charset=utf-8'的响应正文。”

试试这个

[Route("")]
public HttpResponseMessage GetFile()
{
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    try
    {
        var file = XLGeneration.XLGeneration.getXLFileExigence();
        result.Content = new StreamContent(file);
        result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
        var value = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        value.FileName = "Whatever your filename is";
        result.Content.Headers.ContentDisposition = value;
    }
    catch (Exception ex)
    {
        // log your exception details here
        result = new HttpResponseMessage(HttpStatusCode.InternalServerError);
    }
    return result;
}
这实际上应该将其作为一个文件流回。

只是一个想法:

public HttpResponseMessage GetFile()
{
    FileStream file = XLGeneration.XLGeneration.getXLFileExigence();

    using(var sr = new StreamReader(file))
    {
        content = sr.ReadToEnd();

        return new HttpResponseMessage
        {
            Content = new StringContent(content, Encoding.UTF8, "application/json")
        };
    }
}

我正在发布对我有用的东西,以防其他人遇到麻烦

[ActionName("File")]
[HttpGet]
public HttpResponseMessage File()
{
        var response = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new System.IO.FileStream(yourFilePath, System.IO.FileMode.Open);
        response.Content = new StreamContent(stream);
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

        return response;
}

我从WebAPI控制器返回字节[],并成功下载PDF。 我正在使用iTextSharp(LGPL)4.1.6免费PDF转换器。 要安装iTextSharp(LGPL/MPL),请在PackageManager控制台中运行以下命令

安装软件包iTextSharp LGPL-版本4.1.6

服务器端代码

    [Route("Export/ExportToPdf")]

    public byte[] ExportToPdf(string html)
    {           

        MemoryStream msOutput = new MemoryStream();
        TextReader reader = new StringReader(html);
        Document document = new Document(new Rectangle(842, 595));             
        PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
        document.Open();
        document.HtmlStyleClass = @"<style>*{ font-size: 8pt; font-family:arial;}</style>";

        var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(html), null);
        foreach (var htmlElement in parsedHtmlElements)
        {
            document.Add(htmlElement as IElement);
        }

        document.Close();

        return msOutput.ToArray();
    }
[路由(“导出/导出TopDF”)]
公共字节[]ExportToPdf(字符串html)
{           
MemoryStream msOutput=新的MemoryStream();
TextReader=新的StringReader(html);
文档=新文档(新矩形(842595));
PdfWriter writer=PdfWriter.GetInstance(文档,msOutput);
document.Open();
document.HtmlStyleClass=@“*{font size:8pt;font-family:arial;}”;
var parsedhtmlements=HTMLWorker.ParseToList(新的StringReader(html),null);
foreach(parsedhtmlements中的var htmlElement)
{
文件。添加(htmlElement作为IEElement);
}
document.Close();
返回msOutput.ToArray();
}
客户端代码

//Call this function inside of AJAX success.
function ExportToPDF(data) {

    //base64 To ArrayBuffer
    var binaryString = window.atob(data);
    var binaryLen = binaryString.length;
    var bytes = new Uint8Array(binaryLen);
    for (var i = 0; i < binaryLen; i++) {
        var ascii = binaryString.charCodeAt(i);
        bytes[i] = ascii;
    }
    //-------

    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(new Blob([bytes], { type: 'application/pdf' }));
    link.download = "Report.pdf";
    link.click();   
}
//在AJAX success中调用此函数。
函数ExportToPDF(数据){
//base64到ArrayBuffer
var binaryString=window.atob(数据);
var binaryLen=binaryString.length;
var bytes=新的Uint8Array(二进制数);
对于(var i=0;i
查看方法的定义,第二个参数是您试图序列化的值。所以它试图做的是序列化一个
文件流
,这可能是不可序列化的。尝试将文件读入一个字符串,并使用该字符串作为第二个参数。可能相关:@AtefB我已经让此代码在生产环境中运行了将近一年,唯一的区别是我将文件内容读入一个字节数组,并创建一个MemoryStream来创建StreamContent。除此之外,它是从我的生产代码中剪切和粘贴的。@AtefB有两种可能的原因,这可能不适用于您。如果您的XLGeneration.XLGeneration.getxlFileExicience()实际上没有返回流,或者如果您没有用实际的文件名替换“无论您的文件名是什么”,则它只返回文件名,而不返回文件的流file@AtefB如果我知道我的代码给你的特殊情况,我会知道更多关于什么地方出错的信息。您发布的原始代码的问题是WebAPI使用Newtonsoft的JSON.Net作为默认序列化程序。因此,当您向它传递文件流时,它不知道如何处理它。我的代码绕过了使用默认序列化程序的过程。@AtefB请验证您的XLGeneration.XLGeneration.getxlFileExicience()方法返回的是一个流,并且其长度大于0。听起来除了可能是一个空流之外,你没有从这个方法中得到任何东西。这会在发送之前将整个文件加载到内存中@Kevin的解决方案更可取,因为它直接将流发送到客户端。@Miroslav Exception@“使用(var sr=new StreamReader(file))”无法播放流