相关疑难解决方法(0)

从动作返回文件时,流是否会被处置?

我正在写一个字符串,MemoryStream我需要将流返回到Controller Action,所以我可以将其作为文件发送下载.

通常,我将Stream包装在using语句中,但是,在这种情况下,我需要返回它.我退货后还能处理吗?或者我需要以某种方式自行处理它?

//inside CsvOutputFormatter
public Stream GetStream(object genericObject)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream, Encoding.UTF8);
    writer.Write(_stringWriter.ToString());
    writer.Flush();
    stream.Position = 0;
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

Controller返回文件的Action:

[HttpGet]
[Route("/Discussion/Export")]
public IActionResult GetDataAsCsv()
{
    var forums = _discussionService.GetForums(_userHelper.UserId);

    var csvFormatter = new CsvOutputFormatter(new CsvFormatterOptions());

    var stream = csvFormatter.GetStream(forums);
    return File(stream, "application/octet-stream", "forums.csv");

    //is the stream Disposed here automatically?
}
Run Code Online (Sandbox Code Playgroud)

c# memorystream streamwriter asp.net-core-mvc asp.net-core

16
推荐指数
1
解决办法
3758
查看次数

来自 response.Content.ReadAsStreamAsync() 的流不可随机读取

我正在制作一个 .Net Web API 应用程序,其中以下代码调用我的不同 c# 应用程序以下载文件,然后将其保存在磁盘上。有时一切正常,我得到了文件,但有时下面的代码无法读取流,我可以在其他应用程序中看到远程连接关闭异常。

public async Task<string> GetFilePathAsync(TestModel model)
{
    string filePath = string.Empty;
    var response = await cgRequestHelper.DownloadAsync(model);  

    if (response.IsSuccessStatusCode)
    {                    
        filePath = await SaveCgStreamAsync(cgResponse, serviceModel.FileName);
    }
    return filePath;
}

public async Task<HttpResponseMessage> DownloadAsync(TestModel model)
{            
    if (model == null)
        throw new ArgumentNullException("model");
    if (string.IsNullOrEmpty(model.Url))
        throw new ArgumentNullException("Url");
    if (model.Headers == null)
        throw new ArgumentNullException("Headers");

    HttpResponseMessage response;
    using (HttpClient httpClient = new HttpClient())
    {
        foreach (var header in model.Headers)
        {
            httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
        }
        response = await …
Run Code Online (Sandbox Code Playgroud)

c# async-await asp.net-web-api httpcontent httpresponsemessage

3
推荐指数
2
解决办法
2万
查看次数

ASP.NET Core:是否可以使用HttpClient获取文件并直接返回?

我有一个内部 API 可以获取并返回文件结果。但是,此 API 没有任何身份验证/角色/权限检查的概念,并且无法修改以执行此操作。

我想在现有的 ASP.NET Core 2 Web API 上创建一个 Web API 端点来进行权限检查、调用此内部 API 并将文件结果返回给 Web 客户端。

是否可以让包装器 API 端点仅将其获取的任何内容作为文件结果传递,而无需重建响应(例如,指定文件名、内容类型等)?文件可以是图像、pdf、文档。我希望这个包装器 API 只进行权限检查并使用某种 fileId 调用内部 API 端点,而不需要了解内容长度或类型。

c# asp.net-core-webapi asp.net-core-2.0

2
推荐指数
1
解决办法
4358
查看次数