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

C# WCF服务序列化:反序列化程序不知道映射到此名称的任何类型,c#,wcf,C#,Wcf,我试图建立一个WCF服务,但遇到了阻塞问题。我一直在谷歌上搜索,但没有取得任何进展。希望我在这里会有更多的运气 假设我有一个这样定义的作业类: [DataContract] public class Job : IJob { public Job(...) { } [DataMember] public string Example { get { return m_example; } set { m_exam

我试图建立一个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)
    {
        ...
    }
}
我的服务代码如下:

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

我需要在某处放置更多的服务信息吗?我需要在服务端重新实现该对象吗?

您使用接口IJob有什么原因吗?我从未见过WCF以这种方式实现

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

此外,还需要在服务端定义DataContract。因此,如果您要将作业移动到服务库,删除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)
    {
        ...
    }
}
您必须将ServiceKnownType属性放在服务合同接口上

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

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

因为Job是IJob接口的一个实现,所以它真的会有什么不同吗(根本不知道)。回答问题时用“不要那样做”,甚至不尝试回答问题,这是一种糟糕的形式。如果你真的想说,那就等到你有足够的代表来添加评论。@kkshin-这样就行了。唯一的区别是您需要编辑生成的Reference.cs,这是我个人会避免的。在这两种情况下,Andrews建议创建一个新的库是最好的解决方案,因为当服务收到WCF消息时,它需要一个具体的类来将其反序列化。@kkshin-我犯了一个错误,如果您按照我的建议使用DataContract并将其移动到服务库中,那么当您使用Add Service Reference生成客户端时(你在这么做吗?),它将为您的客户端生成作业的定义。因此,您不需要将作业移动到另一个库中。我将修正我的回答,说我以前尝试过这样做,但我得到一个错误,它将引入循环依赖关系。这是因为Job.cs位于另一个程序集中,我必须将其包含在WCF项目中(我想)。好的。您别无选择,只能重构库以删除循环依赖项。将ServiceContract、IJob和作业定义都放在一个库中。然后将服务器实现放在另一个可执行文件或库中,将客户端放在另一个可执行文件中。当您在WCF中编程时,您会习惯于创建大量库。“反序列化程序不知道映射到此名称的任何类型。”这是我在谷歌上搜索到的,并且此解决方案对我有效。谢谢!