У меня есть веб-служба ASP.net, которую я использую для веб-приложения, которое возвращает мне данные XML или JSON, в зависимости от функции, которую я вызываю. Пока это работает, но я столкнулся с проблемой. Я хочу создать ссылку «экспорт» на моей странице, которая загрузит файл JSON. Ссылка отформатирован очень просто:Задание ASP.net webservice для возврата JSON
<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>
Как вы можете себе представить, это должно экспортировать пункт 2. До сих пор так хорошо, да?
Проблема заключается в том, что, поскольку я специально не запрашиваю, чтобы принятый тип контента был JSON, ASP.net абсолютно отказывается отправлять что-либо, кроме XML, что просто не подходит для этой ситуации. Код состоит в следующем:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Item ExportItem(int itemId)
{
Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download
return GetExportItem(itemId);
}
Несмотря на мое указания ResponseFormat как JSON, я всегда получаю обратно XML, если я не прошу этот метод с помощью AJAX (с помощью Google Web Toolkit, КСТАТИ):
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
builder.setHeader("Content-type","application/json; charset=utf-8");
builder.setHeader("Accepts","application/json");
builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});
Это здорово, но AJAX не даст мне диалогового окна загрузки. Есть ли способ заставить ASP.net вернуть мне JSON, независимо от того, как запрашиваются данные? Мне кажется, что отсутствие ручного переопределения для этого поведения является грубым контролем проекта.
БЫСТРЫЙ ОТВЕТ:
Во-первых, позвольте мне сказать, что я думаю, что ответ WOMP является, вероятно, лучший способ пойти на долгий срок (Преобразовать в WCF), но deostroll привел меня к ответу что я буду использовать в ближайшем будущем. Кроме того, следует отметить, что это, по-видимому, работает прежде всего потому, что я хотел просто загрузить, возможно, не так хорошо работает во всех ситуациях. В любом случае, вот код, который я закончил с использованием, чтобы получить результат я хотел:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void ExportItem(int itemId)
{
Item item = GetExportItem(itemId);
JavaScriptSerializer js = new JavaScriptSerializer();
string str = js.Serialize(item);
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
Context.Response.AddHeader("content-length", str.Length.ToString());
Context.Response.Flush();
Context.Response.Write(str);
}
Пожалуйста, обратите внимание на тип возвращаемого ничтожной (что означает, что ваш WDSL будет рядом с бесполезным для этой функции) , Возвращение чего-либо приведет к отмене ответа, который создается вручную.
Обе эти ссылки показывают, как правильно получать данные JSON при использовании запросов AJAX. Как я уже говорил, мой AJAX работает правильно, но мне нужно вернуть JSON в ситуации, когда AJAX не вариант. Вопрос в том, что на самом деле, на стороне сервера, как я могу заставить AJAX всегда возвращаться. – Toji
, чтобы быть ясным и хочу его после обратной передачи, не так ли? – deostroll
Да, это гораздо более простой способ поставить его, спасибо :) – Toji