我正在尝试构建一个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?我是否需要重新实现服务端的对象?
答案 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)
{
...
}
}