Сериализация службы WCF: десериализатор не знает ни одного типа, который сопоставляется с этим именем - PullRequest
1 голос
/ 27 октября 2010

Я пытаюсь создать службу WCF, но столкнулся с проблемой блокировки.Я гуглил вокруг, но я не смог добиться никакого прогресса.Надеюсь, мне повезет больше.

Допустим, у меня есть класс работы, определенный следующим образом:

[DataContract]
public class Job : IJob
{
    public Job(...)
    {
    }

    [DataMember]

    public string Example
    {
        get { return m_example; }
        set { m_example = value; }
    }
}

Теперь, что я делаю, это что-то вроде

public void DoSomething()
{
    ExampleServiceProxy.ExampleClient proxy = new ExampleServiceProxy.ExampleClient();
    proxy.DoSomething(job);
}

Внутри моего Reference.cs я добавил некоторые атрибуты ServiceKnownTypeAttribute следующим образом:

...
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(Job))]
void DoSomething(object job);

Мой сервисный код выглядит следующим образом:

[ServiceContract]
public interface IExample
{
    [OperationContract]
    void DoSomething(IJob);
}

public class Example : IExample
{
    public void DoSomething(IJob job)
    {
        ...
    }
}

Нужно ли добавлять дополнительные ServiceKnownTypeAttributesгде-то?Нужно ли переопределять объект на стороне службы?

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

Вы должны поместить атрибут ServiceKnownType в интерфейс контракта на обслуживание.

[ServiceContract] 
public interface IExample 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(Job))]
    void DoSomething(IJob); 
} 

public class Example : IExample 
{ 
    public void DoSomething(IJob job) 
    { 
        ... 
    } 
} 
0 голосов
/ 27 октября 2010

Есть ли причина, по которой вы используете интерфейс IJob?Я никогда не видел, чтобы WCF реализовывался таким образом.

Когда я внедряю WCF, я всегда использую DataContract, то есть Job.Я делаю это, потому что DataContract является контрактом между двумя сторонами и не имеет никакого поведения.Где, поскольку у Сервиса есть поведение, использование интерфейса - хорошая идея.

Также необходимо определить DataContract на стороне службы.Поэтому, если вам нужно переместить Job в библиотеку Service, удалить IJob, удалить существующую ссылку в Client и восстановить ее, она будет работать нормально.

Вот код службы:

[ServiceContract]
public interface IExample
{
    [OperationContract]
    void DoSomething(Job);
}

[DataContract]
public class Job 
{
    public Job(...)
    {
    }

    [DataMember]

    public string Example
    {
        get { return m_example; }
        set { m_example = value; }
    }
}

public class Example : IExample
{
    public void DoSomething(Job job)
    {
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...