2009-09-09 4 views
20

У меня есть веб-служба 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 будет рядом с бесполезным для этой функции) , Возвращение чего-либо приведет к отмене ответа, который создается вручную.

ответ

2

Вот два форумы темы для справки:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982.aspx#2338982

у меня нет четкого представления. Они говорят, сосредоточившись на настройке типа контента для приложения/json. Я раньше не работал с wcf, но думаю, вы можете использовать объект Response.

Задайте тип содержимого объекта ответа. Сделайте response.write, передавая ваши данные json в виде строки, а затем выполните response.end.

+0

Обе эти ссылки показывают, как правильно получать данные JSON при использовании запросов AJAX. Как я уже говорил, мой AJAX работает правильно, но мне нужно вернуть JSON в ситуации, когда AJAX не вариант. Вопрос в том, что на самом деле, на стороне сервера, как я могу заставить AJAX всегда возвращаться. – Toji

+0

, чтобы быть ясным и хочу его после обратной передачи, не так ли? – deostroll

+0

Да, это гораздо более простой способ поставить его, спасибо :) – Toji

11

Веб-службы Asp.net - это веб-службы на основе SOAP. Они всегда будут возвращать XML. Библиотеки Ajax пришли, и материал ScriptMethod был представлен, но он не меняет основную концепцию.

Есть пара вещей, которые вы можете сделать.

WebMethods устаревают с введением WCF.Вы можете рассмотреть migrating your web services to WCF, в котором у вас будет гораздо больший контроль над выходным форматом.

Если вы не хотите этого делать, вы можете вручную сериализовать результат своих вызовов веб-службы в JSON, и служба будет обернуть это в заголовок SOAP. Затем вам нужно будет удалить материал SOAP.

+0

Я определенно считаю, что это «лучший» ответ, но, к сожалению, у меня нет времени доступный мне для полноценного преобразования прямо сейчас. Это маршрут, который я буду использовать для будущих проектов. Спасибо за совет. – Toji

+2

Если они не поддерживают JSON и «всегда возвращают XML», то для чего этот декоратор? [ScriptMethod (ResponseFormat = ResponseFormat.Json)] – NickG

1

Просто подумал, что я выброшу это, так как ранее не упоминалось ... если вы используете WebServices с ASP.NET 3.5, JSON является стандартным форматом возврата. Он также поставляется вместе с сериализатором JSON, поэтому вы можете прекратить использование JavascriptSerializer.

This article В блоге Рика Стралла рассказывается о строго типизированном преобразовании, которое вы можете выполнять между серверными боковыми классами и объектами JSON от клиента.

Я недавно завершил проект, используя этот новый материал JSON в .NET 3.5, и я очень впечатлен производительностью. Возможно, стоит посмотреть ...

+0

Спасибо! Я взгляну! – Toji

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