3

我试图让以下代码作为 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 文件。

4

3 回答 3

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

于 2013-05-13T18:32:47.697 回答
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
    }

并在 web config 中配置它:

<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)。不过,您仍然必须将内容类型标头放入响应中。

于 2013-05-13T18:29:26.620 回答
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());
于 2013-05-13T18:33:17.627 回答