2014-07-22 4 views
0

Я пытаюсь вернуть object из моего вызова функции WCF, и если я укажу тип в своем ServiceModel, результат будет отправлен успешно.WCF Возвращает пользовательский результат с типом объекта

Но если я посылаю объект displayme сообщение вроде:

Эта операция не поддерживается в тестовом ФОС клиента, поскольку он использует тип

Код:

[DataContract] 
public class ServiceModel 
{ 
    [DataMember] 
    public int status { get; set; } 

    [DataMember] 
    public string message { get; set; } 

    [DataMember] 
    public requestdVM result { get; set; } 
    //public object result { get; set; } 
} 

Проблема аналогична: WCF service: Returning custom objects, но в качестве решения они меняют тип

+0

Вы могли бы указать код 'requestdVM'? –

+0

Я читал [эту статью] [1] и говорит: вы не можете вернуть «объект», поскольку он не сериализуется с WCF. Если объекты будут перенаправлены на , тогда они должны быть обычными сериализованными объектами, которые украшены атрибутом [Serializable]. [1]: http://www.pcreview.co.uk/forums/returning-object-wcf-service-t3907849.html @HenkaProgrammer – MrMins

+1

Это может помочь - http: // stackoverflow.com/questions/5204893/wcf-send-an-unknown-type-to-a-wcf-service – Jsinh

ответ

1

Совсем нет такой возможности, как использование базовых общих объектов в WCF-сервисах.

Вот пример объявления типа WSDL:

<complexType name="TimePeriod"> 
     <all> 
      <element name="StartTime" type="xsd:timeInstant"/> 
      <element name="EndTime" type="xsd:timeInstant"/> 
     </all> 
    </complexType> 

Эта схема видна для клиентов, а затем .NET может понять, что он может использовать свой собственный объект и передать его. В .NET это будет similar to

[DataContract] 
public class TimePeriod 
{ 
    [DataMember] 
    public DateTime StartTime {get;set;} 
    [DataMember] 
    public DateTime EndTime {get;set;} 
} 

Java может понять WSDL и использовать собственный класс и объекты; Python может это сделать, PHP может это сделать, надеюсь, что у вас есть идея SOA.

Теперь вы хотите отправить объект, который может быть чем угодно. Это невозможно сделать с контрактами.

Однако, если вы можете пообещать, что в вашем проекте используется только .NET, тогда есть решение.
Идея состоит в том, чтобы сериализовать объект .NET в двоичном формате и указать имя типа объекта. Затем на стороне клиента десериализуйте его. Конечно, вы не можете просто сделать это с отправкой объекта с .NET на, скажем, на Python.

1) Малый объект отправки в строчном формате XML

[Serializable] 
public class Data 
{ 
    public string TypeName {get;set;} // typeof(string), typeof(int), etc. 
    public string Xml {get;set;} // serialized object via XmlSerializer 
} 

Затем после сериализации и приема объекта в клиенте может быть десериализован

Data objectData;// we got it from service 
    var serializer = new XmlSerializer(typeof(objectData.TypeName)); 
    object result; 

    using (TextReader reader = new StringReader(objectData.Xml)) 
    { 
     result = serializer.Deserialize(reader); 
    } 

Также двоичная сериализация может использоваться вместо XML, то будет свойство byte [].

2) Второе решение будет использовать двоичный поток и имя типа записи в header of message, подход аналогичен первой точке.

Все зависит от ситуации, но я рекомендую его для больших файлов (> 1 МБ).

+0

Проблема в том, что мне нужно отправить результат в результате различных результатов в результате моей службы. Затем, я пытаюсь создать общий сервис для отправки различных типов результатов (String, Int32, настраиваемые типы и т. Д.) @Artru – MrMins

+0

, пожалуйста, проверьте ответное обновление – Artru

+0

@MrMins, если это путает, просто напишите о слепых точках, и я уточню их – Artru

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