WCF - исключение сериализации даже после предоставления DataContract и DataMember - PullRequest
1 голос
/ 05 июня 2010

Я получаю следующее исключение, хотя я указал Datacontract и Datamember.Не могли бы вы помочь мне понять, в чем проблема?

"Тип 'MyServiceLibrary.CompanyLogo' не может быть сериализован. Попробуйте пометить его атрибутом DataContractAttribute и отметить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute. "

Примечание. Исключение возникает при запуске хоста службы.Я даже не создал клиента.

using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Runtime.Serialization;
using MyServiceLibrary;

namespace MySelfHostConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.ServiceModel.ServiceHost myHost = new ServiceHost(typeof(NameDecorator));
            myHost.Open(); 
            Console.ReadLine();
        }
    }

}

//The Service is 

using System.ServiceModel;
using System.Runtime.Serialization;

namespace MyServiceLibrary
{
    [ServiceContract(Namespace = "http://Lijo.Samples")]
    public interface IElementaryService
    {
        [OperationContract]
        CompanyLogo GetLogo();
    }

    public class NameDecorator : IElementaryService
    {
        public CompanyLogo GetLogo()
        {
            Shape cirlce = new Shape();
            CompanyLogo logo = new CompanyLogo(cirlce);
            return logo;
        }
    }

    [DataContract]
    public class Shape
    {
        public string SelfExplain()
        {
            return "sample";
        }

    }

    [DataContract]
    public class CompanyLogo
    {
        private Shape m_shapeOfLogo;

        [DataMember]
        public Shape ShapeOfLogo
        {
            get
            {
                return m_shapeOfLogo;
            }
            set
            {
                m_shapeOfLogo = value;
            }
        }

        public CompanyLogo(Shape shape)
        {
            m_shapeOfLogo = shape;
        }
        public CompanyLogo()
        {

        }
    } 

}

// И конфигурация хоста

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.serviceModel>
    <services>

      <service name="MyServiceLibrary.NameDecorator"
               behaviorConfiguration="WeatherServiceBehavior">

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8017/ServiceModelSamples/FreeServiceWorld"/>
          </baseAddresses>
        </host>

        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="MyServiceLibrary.IElementaryService" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WeatherServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Спасибо

Lijo

Ответы [ 2 ]

1 голос
/ 05 июня 2010

Не могу подтвердить эти проблемы - работает как брелок на моей машине. Я могу запустить и запустить сервисный хост, без проблем. Я могу подключиться к нему из WCF Service Test Client, и запрос выглядит так:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://Lijo.Samples/IElementaryService/GetLogo</Action>
  </s:Header>
  <s:Body>
    <GetLogo xmlns="http://Lijo.Samples" />
  </s:Body>
</s:Envelope>

и ответ таков:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <GetLogoResponse xmlns="http://Lijo.Samples">
      <GetLogoResult xmlns:a="http://schemas.datacontract.org/2004/07/SerializeLogo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:ShapeOfLogo>
          <a:ShapeName i:nil="true" />
        </a:ShapeOfLogo>
      </GetLogoResult>
    </GetLogoResponse>
  </s:Body>
</s:Envelope>

С моей точки зрения: этот сервис работает (мало что делает - но работает).

Дважды и трижды проверьте все ваши параметры - что-то должно быть как-то выключено ....

1 голос
/ 05 июня 2010

Ваш класс CompanyLogo должен иметь конструктор по умолчанию без параметров, в противном случае он не может быть сериализован.

Редактировать: Создал новый проект, скопировал, вставил свой код, и все, кажется, работает нормально. Убедитесь, что на вашу сервисную библиотеку ссылаются правильно и не использует старую версию без атрибута.

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