2013-05-13 7 views
3

Я пытаюсь получить следующий код для возврата в виде json-файла вместо того, чтобы возвращать файл Aspx. Я использовал аналогичный код в PHP, который работает, однако я не могу дублировать его на C#. Я хотел бы, чтобы он ответил как .json-файл.Возвращение JSON в файл .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-файл.

+0

записать его в файл. 'System.IO.File.WriteAllText (@" D: \ path.txt ", json);' –

+1

@RobertHarvey Я думаю, что он хочет вернуть ** страницу ** с типом контента json, а не писать на нем файл ... может быть ошибочным. – Mansfield

+0

Вы хотите добавить '.json' в список управляемых расширений файлов? Итак, 'GET foo.json' попадает в управляемый конвейер и .NET-стек? – lukiffer

ответ

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). Однако вам все равно придется помещать заголовки содержимого в ответ.

+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

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()); 
+0

Должен хорошо работать для inline = false. С inline = true некоторые браузеры (я смотрю на вас, IE), похоже, игнорируют имя файла, когда вы делаете Ctrl-S. –

+0

Спасибо, я могу использовать это для другой части системы, где они будут загружать файлы таким образом –

Смежные вопросы