Служба WCF, сериализация Json и поиск ошибок - PullRequest
0 голосов
/ 26 мая 2011

Допустим, у меня есть простой сервис WCF:

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    object Operation();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : ITestService
{
    public object Operation()
    {
          return /*some object*/
    }
}

и страница aspx, которая выполняет вызов ajax для этого сервиса и использует возвращенный объект, вот вызов ajax:

$.ajax({
    type: "POST",
    url: "TestService.svc/Operation",
    async: false,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    processdata: true,
    success: function (msg) {
     var res = msg.OperationResult;
    },
    error: function (xhr, msg, thrown) {
     var error = xhr;
    }
});

Если Operation () возвращает простой объект, такой как строка или число, то msg.OperationResult возвращает этот объект, ошибки не выдается, все работает нормально.Однако если я попытаюсь вернуть сложный объект, который имеет открытые и внутренние свойства открытых и внутренних ссылочных типов, то msg.OperationResult, переданный в случае успешного обратного вызова, не определен.Ошибка обратного вызова не возникает.Кажется, что WCF пытается сериализовать сложный объект, сталкивается с ошибкой и просто возвращает ноль, а не вызывает исключение.Вопрос - как я могу справиться с этим типом ошибок?Какой сериализатор используется WCF внутри?Это DataContractJsonSerializer?

1 Ответ

2 голосов
/ 27 мая 2011
  1. да, это DataContractJsonSerializer, который используется.
  2. WCF будет сериализовать только те типы, о которых он знает . Вы объявили тип возврата как object, поэтому он сможет возвращать только экземпляры System.Object или примитивные типы, которые всегда известны WCF (такие как числа, строки, DateTime и т. Д.). Если вам нужно вернуть сложный тип, вам нужно объявить его как известный тип в контракте, как показано ниже.

Контракт с декларацией для известного типа. Для получения дополнительной информации см. Документацию по атрибуту ServiceKnownType .

[ServiceContract]
public interface ITestService {
    [OperationContract]
    [ServiceKnownType(typeof(MyComplexType))]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    object Operation();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...