将JSON作为.json文件返回

时间:2013-05-13 18:22:59

标签: c# asp.net json

我试图让以下代码作为json文件返回,而不是返回Aspx文件。 我在PHP中使用了类似的代码,但是,我无法在C#中复制它。我希望它以.json文件的形式响应。

 string json = JsonConvert.SerializeObject(output, Formatting.Indented);
        Response.Headers.Add("Content-type", "application/json; charset=utf-8");
        Response.Headers.Add("Expires"," Mon, 26 Jul 1997 05:00:00 GMT"); 
        Response.Headers.Add("Pragma.","no-cache");
        Response.Cache.SetNoStore();

输出正常,我只是希望它被识别为.json文件。

3 个答案:

答案 0 :(得分:5)

提升"文件下载"对话框你应该尝试Content-disposition,我不知道它将如何与json一起使用,但当我将它用于pdf时,它对我来说很好。

string json = JsonConvert.SerializeObject(output, Formatting.Indented);
Response.Headers.Add("Content-type", "application/json; charset=utf-8");
Response.Headers.Add("Content-disposition", "attachment;filename=\"a.json\"");
Response.Headers.Add("Expires"," Mon, 26 Jul 1997 05:00:00 GMT"); 
Response.Headers.Add("Pragma.","no-cache");
Response.Cache.SetNoStore();

这是msdn文档http://support.microsoft.com/kb/260519

的链接

答案 1 :(得分:4)

尝试使用:

// note the case
Response.Headers.Add("Content-Type", "application/json; charset=utf-8"); 

甚至更好:

Response.ContentType = "application/json; charset=utf-8";

对于你似乎做的事情,我建议使用IHttpHandler而不是aspx页面。您甚至可以将其配置为具有json扩展名(尽管扩展名不应该那么重要)。这是一个例子:

public class CustomHttpHandler : IHttpHandler
{
    // return true to reuse (cache server-side) the result 
    // for the same request parameters or false, otherwise 
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        var response = context.Response;
        // do with the response what you must
    }

并在网络配置中配置它:

<configuration>
    </system.web>
        <httpHandlers>
            <remove verb="*" path="*.asmx" />
            <add verb="*" 
                 path="*.asmx" 
                 validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions" />
            <add verb="*" 
                 path="*_AppService.axd" 
                 validate="false" 
                 type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions" />
            <add verb="GET,HEAD" 
                 path="ScriptResource.axd" 
                 type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions" validate="false" />
            <!-- your handler here: -->
            <add verb="GET" 
                 path="CustomHttpHandler.json" 
                 type="YourApp.CustomHttpHandler, YourApp" />
        </httpHandlers>
     </system.web>
</configuration>

您可以使用动词来使句柄对GET / POST或其他请求类型可访问,对所有请求使用"*"。处理程序可以“〜/ CustomHttpHandler.json”访问 - 请注意添加的json扩展名(原始名称为.ashx)。您仍然必须将内容类型标题放在响应中。

答案 2 :(得分:2)

您可以使用“Content-Disposition”标题设置返回数据的文件名。

请参阅:http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html

var cd = new System.Net.Mime.ContentDisposition
{
  FileName = "MyData.json",

  // always prompt the user for downloading, set to true if you want 
  // the browser to try to show the file inline
  Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());