RESTful ASP.NET webservice - Как я могу вернуть JSON-сериализованный словарь <строка, объект>? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть веб-сервис RESTful, который возвращает сериализованные данные в формате JSON.Он может успешно сериализовать объект Dictionary<string, string>, но я бы хотел, чтобы каждая функция могла возвращать Dictionary<string, object>.

Когда я возвращаю Dictionary<string, string>, я получаю ожидаемый ответ JSON.Но когда я пытаюсь вернуть Dictionary<string, object>, я получаю следующий ответ:

Ошибка ReadResponse (): сервер не возвратил ответ на этот запрос.

Итак, НА КОДЕКС! Вот код Dictionary<string, object>, который не работает :

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, object> Test(String Token, String Id)
{
    Dictionary<string, object> testresults = new Dictionary<string, object>();
    testresults.Add("Test1Key", "Test1Value");

    Dictionary<string, string> innertestresults = new Dictionary<string, string>();
    innertestresults.Add("InnerTest1Key", "InnerTest1Value");
    innertestresults.Add("InnerTest2Key", "InnerTest2Value");

    testresults.Add("Test2Key", innertestresults);

    return testresults;
}

И, просто для справки, вот код Dictionary<string,string>, который отлично работает :

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, string> Test(String Token, String Id)
{
    Dictionary<string, string> testresults = new Dictionary<string, string>();
    testresults.Add("Test1Key", "Test1Value");
    testresults.Add("Test2Key", "Test2Value");
    testresults.Add("Test3Key", "Test3Value");

    return testresults;
}

Если у кого-нибудь есть идеи, как заставить это работать (или какие-либо альтернативные способы сделать это, чтобы получить тот же конечный результат), пожалуйста, дайте мне знать!Я довольно открыт, как это сделать.

По теме использования ... причина, по которой мне нужен микс, заключается в том, чтобы я мог возвращать результаты, подобные этому (где "Часть данных может быть НИЧЕГО ... не обязательно чем-то с ID ключа, Type и MaxUsers):

{"Status":"Success","Data":{"ID":"1234","Type":"Live","MaxUsers":"5"}}
{"Status":"Failure","Error":"ID does not exist"}

Спасибо всем большое!

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Я могу воссоздать ошибку, с которой вы столкнулись, но вам не повезло, когда сервис автоматически сериализировал объект Dictionary<string, object>.

Одним из обходных путей является сериализация объекта в коде с использованием класса JavaScriptSerializer и возвращение полученной строки следующим образом:

using System.Web.Script.Serialization;

...

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string Test(String Token, String Id)
{
    Dictionary<string, object> testresults = new Dictionary<string, object>();
    testresults.Add("Test1Key", "Test1Value");

    Dictionary<string, string> innertestresults = new Dictionary<string, string>();
    innertestresults.Add("InnerTest1Key", "InnerTest1Value");
    innertestresults.Add("InnerTest2Key", "InnerTest2Value");

    testresults.Add("Test2Key", innertestresults);

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string json = serializer.Serialize(testresults);

    return json;
}

Надеюсь, это поможет.

Редактировать (на основе комментариев)

Хорошо, потратил немного времени на изучение этого, и кажется, что вам нужно подробно описать типы, которые будут присутствовать в графе объектов при сериализации, используя атрибут ServiceKnownType .

ServiceKnownType необходимо добавить в качестве атрибута вашей службы, и в вашем случае вам нужно объявить тип Dictionary<string, string> следующим образом:

[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceContract(Namespace = "WebApplication1")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service...
0 голосов
/ 14 августа 2014

Я бился головой об аналогичной проблеме: когда служба выполнялась без каких-либо исключений, но вызов ajax не выполнял метод успеха, и в каждом браузере сообщение об ошибке было непоследовательным.

Когда я возвращал словарь. Мой класс объекта имел некоторые свойства типа DateTime. Я нашел несколько сообщений в Google относительно формата DateTime в JSON и C #. Я изменил эти свойства с DateTime на string и работал.

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...