@nervousnerd

Веб-сервис не хочет отдавать результат в JSON

Пишем небольшой веб-сервис, одновременно отлаживаем его под ASP.NET и Mono.
Нам нужно отдавать по запросу некий объект, предварительно сериализовав его в JSON.
По умолчанию, ASP.NET Web Service отдаёт объекты в формате XML, но нам надо именно JSON.
Мы проставили нужные декораторы, согласно мануалам, но результат всё равно помещается в XML-обёртку…
Версия .NET 3.5, результат одинаковый и для ASP.NET и для Mono.


Имеем следующий код:
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        [WebMethod()]
        public string InitService()
        {
            ...
            return "Service initialized OK";
        }
        ...
}


Запрос через отладочную страницу веб-сервиса выдаёт следующий результат:
<string>Service initialized OK</string>

Ни намёка на JSON.
Аналогичная ситуация с XHR-запросами со страниц. Сервис любой результат оборачивает в XML.

Как это побороть, подскажите пожалуйста.
  • Вопрос задан
  • 6472 просмотра
Пригласить эксперта
Ответы на вопрос 2
Iliapan
@Iliapan
Вот как мы это делаем — отправка запроса в json и обратно:

With input
.token = token
.application_id = application_id
.login = login
.locale = locale
End With
'// сериализуем объект ClientInfo в формат нотации JSON

Dim stream1 As New MemoryStream()
Dim ser As New DataContractJsonSerializer(input.GetType)
ser.WriteObject(stream1, input)
stream1.Position = 0
Dim sr As New StreamReader(stream1)
Dim json As String = sr.ReadToEnd

' // создаем клиента
Dim wc As WebClient = New WebClient()

'// отправляем POST-запрос и получаем ответ
Dim result() As Byte = wc.UploadData(wsdl, "POST", System.Text.Encoding.UTF8.GetBytes(json))

Dim t As String = Encoding.UTF8.GetString(result)

stream1.Close()

Dim stream2 As New MemoryStream
Dim sw As New StreamWriter(stream2)
sw.Write(t)
sw.Flush()
stream2.Position = 0

If t.Contains("error_detail") Then
Dim myErr As New yaError
Dim ser2 As New DataContractJsonSerializer(myErr.GetType)

' Deserialize the data and read it from the instance.
myErr = CType(ser2.ReadObject(stream2), yaError)
stream2.Close()
Return myErr
Else
Dim ser2 As New DataContractJsonSerializer(reply.GetType)
reply = ser2.ReadObject(stream2)
Return reply
End If
Ответ написан
@Hoobert
Когда-то давно делал сериализацию в JSON. Вот небольшой проект, может поможет разобраться: dl.dropbox.com/u/45936881/ArcGisRestHelper.zip
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы