WCF REST JOSN вернуть динамический список - PullRequest
0 голосов
/ 31 октября 2018

Как я могу вернуть объект, содержащий динамический список?

У меня есть работающий REST-сервис, в котором я хочу вернуть данные JSON. Это работает довольно хорошо в большинстве случаев - за исключением одного:

В этом конкретном случае у меня есть List<Bla>, который может содержать объекты типа Bla и Bla1 (который наследуется от Bla). Как только я добавляю Bla1 в список, в браузере появляется ошибка.

Firefox: Блокирован перекрестный запрос: одна и та же политика происхождения запрещает чтение удаленного ресурса на https: //.../DoSomething. (Причина: запрос CORS не выполнен).

Chrome: GET https: //.../DoSomething net :: ERR_SPDY_PROTOCOL_ERROR

Как вернуть объект, содержащий динамический список?

Классы

[DataContract]
public class Blibla
{
    [DataMember] public bool requestSuccess;
    [DataMember] List<Blubb> blubb;
    [DataMember] List<Bla> blas;

    public Blibla(bool success)
    {
        this.requestSuccess = success;
        blubb = new List<Blubb>() { new Blubb(11, "einser"), new Blubb(22, "zweier"), new Blubb(33, "dreier") };
        blas = new List<Bla>() { new Bla(11), new Bla1(22, 22) };
    }
}

[DataContract]
public class Bla
{
    [DataMember] public int id;

    public Bla(int id)
    {
        this.id = id;
    }
}

[DataContract]
public class Bla1 : Bla
{
    [DataMember] public int num;

    public Bla1(int id, int num) : base(id)
    {
        this.num = num;
    }
}


[DataContract]
public class Blubb
{
    [DataMember] public int ID;
    [DataMember] public string name;

    public Blubb(int id, string name)
    {
        this.ID = id;
        this.name = name;
    }
}

IService:

[Description("returns service's details")]
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
Blibla DoSomething();

Услуги:

public Blibla DoSomething()
{
    Message msg;
    DoHttpMethodTypeSpecific();

    Blibla bb = new Blibla(true);
    return bb;
}

EDIT

Ответ Авраама Цяна - именно то, что я искал.
Мой сервис отвечает правильно сериализованным Bla1 -объектом.

{
    "__type":"Bla1",
    "id":22,
    "num":22
}

Если кто-то знает способ подавления автоматически добавленного "__type":"Bla1"
пожалуйста, дайте мне знать ...

1 Ответ

0 голосов
/ 01 ноября 2018

По вашей ошибке и коду я провел тест и обнаружил, что в классе Bla есть проблема с сериализацией. При передаче класса Bla WCF не мог распознать подкласс (Bla1) и как их сериализовать, поэтому мы должны добавить атрибут KnowType в базовый класс.

[DataContract]
[KnownType(typeof(Bla1))]
public class Bla
{
    [DataMember] public int id;
    public Bla(int id)
    {
        this.id = id;
    }
}

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-known-types

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