Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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# 如何生成包含JSON结构的下载文件?_C#_File_Download_Asp.net Core 2.2 - Fatal编程技术网

C# 如何生成包含JSON结构的下载文件?

C# 如何生成包含JSON结构的下载文件?,c#,file,download,asp.net-core-2.2,C#,File,Download,Asp.net Core 2.2,我的控制器中有此方法 public IActionResult Download() { return Json(_context.Users); } 我注意到它生成了正确的JSON结构,但它在浏览器中呈现为普通文本。我想把它下载到客户端的计算机上。我该怎么做 我不确定是应该让我的对象以某种方式流式传输,还是在我的硬盘上创建一个文件并提供服务 我找不到任何像我们在C#中习惯的那样直截了当、简单的东西。因此,我担心我在这里遗漏了一个概念。将数据转换为字节,然后将这些字节转换为FileResu

我的控制器中有此方法

public IActionResult Download()
{
  return Json(_context.Users);
}
我注意到它生成了正确的JSON结构,但它在浏览器中呈现为普通文本。我想把它下载到客户端的计算机上。我该怎么做

我不确定是应该让我的对象以某种方式流式传输,还是在我的硬盘上创建一个文件并提供服务


我找不到任何像我们在C#中习惯的那样直截了当、简单的东西。因此,我担心我在这里遗漏了一个概念。

将数据转换为字节,然后将这些字节转换为FileResult。您返回FileResult,浏览器将在显示“文件”时执行正常操作,通常提示用户或下载

示例如下:

public ActionResult TESTSAVE()
    {
        var data = "YourDataHere";
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);
        var output = new FileContentResult(bytes, "application/octet-stream");
        output.FileDownloadName = "download.txt";

        return output;
    }

在您的例子中,您只需将JSON数据作为字符串。

您只需将JSON对象写入流或数组,并使用
文件
方法重载之一。添加方便的
序列化方法

private byte[] Serialize(object value, JsonSerializerSettings jsonSerializerSettings)
{
    var result = JsonConvert.SerializeObject(value, jsonSerializerSettings);

    return Encoding.UTF8.GetBytes(result);
}
并使用它如下

public IActionResult Download()
{
    var download = Serialize(_context.Users, new JsonSerializerSettings());

    return File(download , "application/json", "file.json");
}
如果使用
.AddJsonOptions()
Startup
中设置特殊的json序列化程序设置,则希望将其用作
ASP.NET
框架在
json
方法中使用的设置。在控制器中插入
MVCJS选项

IOptions<MvcJsonOptions> _options;

public YourController(IOptions<MvcJsonOptions> options)
{
    _options = options;
}

您不能在服务器端执行太多操作-如何显示给定的mime类型由浏览器决定。。。您可以尝试使用一些二进制类型“application/…”来回复,以说服浏览器不要将响应视为文本。。。但你为什么在乎?通常你会用JavaScript调用服务,而不是通过链接…@AlexeiLevenkov应用程序是在服务器端呈现的,用户的应用程序是非常非技术性的。我需要模仿他们从其他下载中识别的行为。我完全可以随意使用这种格式——现在正好是JSON格式,因为我正在序列化一些数据。但是他们不会打开文件,真的-我可以用任何方式拍摄它。您建议如何在控制器中强制使用二进制类型?@AlexeiLevenkov通常您不会在MVC中使用JS调用服务,因为这会造成安全漏洞,而且使用单独的语言/框架执行内置操作也是一种糟糕的编程实践。n已在使用的。您可以使用fileresult操作(如下)告诉浏览器这是文件而不仅仅是文本。正在使用的浏览器将从此处处理该问题。@Slipoch需要澄清“您不会在MVC中使用JS调用服务,因为这会造成安全漏洞,而且使用单独的语言/框架来执行内置的操作也是一种糟糕的编程做法”?-你在这里看到了什么“安全漏洞”,为什么在网页上使用JavaScript是不好的做法,从网页访问web服务的“内置”到底是什么,为什么服务器端代码使用ASP.Net MVC(例如与NodeJS或Java相比)会有特别的问题?@AlexeiLevenkov,Std JS在客户端运行,同样对于服务器端风格(如Angular),它们往往有许多可以从客户端攻击的漏洞(尽管这比vanilla JS更难)。为一个已经得到支持的特性引入一个新框架通常被认为是糟糕的编程实践,因为在不需要的地方引入了复杂性和额外的代码。OP特别指出这是来自服务器端的C#控制器,它可能不使用JS。C#MVC将执行OP想要的操作(从点击控制器下载文件)。
public IActionResult Download()
{
    var download = Serialize(_context.Users, _options.Value.SerializerSettings);

    return File(download , "application/json", "file.json");
}