WCF服务序列化:反序列化器不知道映射到此名称的任何类型

时间:2010-10-27 01:02:55

标签: c# wcf

我正在尝试构建一个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 个答案:

答案 0 :(得分:4)

您必须将 ServiceKnownType 属性放在服务合约界面上。

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

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

答案 1 :(得分:-1)

你有没有理由使用IJob接口?我从未见过以这种方式实现的WCF。

当我实现WCF时,我总是使用DataContract,即Job。我这样做是因为DataContract是双方之间的合同,并且没有任何行为。服务确实有行为,所以使用界面是个好主意。

还需要在服务端定义DataContract。因此,如果您要将Job移动到服务库,请删除IJob,删除客户端中的现有引用并重新生成它,它将正常工作。

这是服务代码:

[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)
    {
        ...
    }
}