2013-11-26 3 views
0

Нужно ли это быть сериализуемым, а что нет?Что требуется для возврата контракта на операцию?

кажется, что, когда я использую пользовательский класс, я бы что-то вроде:

[OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
    IECInstance testme(); 

и в определении его:

public IECInstance testme() 
    { 
     IECInstance tst = ...; 
     return tst; 
    } 

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

Возможно, этот предмет не является сериализуемым, и это была большая вещь, о которой я думал, была проблема.

Интерфейс для IECInstance является:

public interface IECInstance : 
    IECNamedValueContainer, 
    IECValueContainer, 
    IEnumerable<IECPropertyValue>, 
    IEnumerable, 
    IECDump, 
    ICloneable, 
    IExtendable 
    { 
    ... 
    } 

и я думал, что по крайней мере один, если не больше из этих пунктов были сериализации, но сам интерфейс не помечены в верхней части с : [Serialized] или [Serializable]

Что требуется для типа возвращаемого значения?

+0

Вы должны применить Serializable атрибут к вашему типу возвращаемого значения. Не забывайте, что атрибут Serializable не наследуется, поэтому, если вы примените его к интерфейсу, это не сработает. Вам нужно применить его непосредственно к классу. –

+0

Что делать, если объект не может быть изменен, это из библиотеки DLL? – Fallenreaper

+0

Кроме того, если вы еще не убедитесь, что добавили [ServiceContract] над своим интерфейсом. – MightyLampshade

ответ

1

Try используя ServiceKnownTypeAttribute

[OperationContract] 
[WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
[ServiceKnownType(typeof(WhateverYourECInstanceTypeIs))] 
IECInstance testme(); 

и да конкретный тип необходимо будет serializeable как так

[DataContract] 
public class WhateverYourECInstanceTypeIs : IECInstance 
{ 
    [DataMember] 
    public int Foo { get; set; } 
} 
+0

Ahh, так что я предполагаю, что за пределами базовых типов данных мне придется использовать контракты данных для передачи данных, поскольку это поможет определить более или менее объект JSON рода? – Fallenreaper

+0

Да. До DataContract, в ASMX раз, вы использовали бы этот атрибут serializeable. Теперь любой класс, который является DataContract, с DataMembers, может быть сериализован в json/xml через DataContractSerializer или DataContractJsonSerializer. Конечно, вы можете сериализовать, используя их напрямую, однако в WCF вы будете использовать поведение конечных точек, которые используют соответствующий сериализатор. Похоже, вы пытаетесь сделать веб-сервис JSON, возможно, REST? Если вы можете рассмотреть WebAPI. –

+0

Мы делали довольно простые сервисы RESTful, которые мы можем переместить в WebAPI. Проблема в том, что IECInstance - это интерфейс в основном, но сама структура сериализуема, поэтому я работаю над созданием структуры, которую использовал бы WebAPI OR RESTful. – Fallenreaper

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