返回自定义类的WCF服务在Reference.cs中生成错误

时间:2009-10-29 10:03:41

标签: c# visual-studio-2008 wcf datacontract

我在Visual Studio 2008中有一个WCF服务项目,它包含大约12个方法,其中一些返回原始类型,如bool或string。我还有一个Visual Studio单元测试项目,它引用了已发布的WCF服务。当所有返回类型都是原始的时,Test Project会成功编译。

如果我向返回自定义类的服务添加新方法,发布它并更新Test Project中的服务引用,则它不会编译。错误是: -

  1. “PublisherFaultException”类型已包含“Reason”的定义。
  2. “PublisherFaultException”类型已包含“PropertyChanged”的定义。
  3. 类型'Publisher.Test.LibraryReference.PublisherFaultException'已经使用相同的参数类型定义了名为'RaisePropertyChanged'的成员。
  4. 全部在自动生成的reference.cs文件中。

    WCF服务方法的合同是: -

    Page GetItem(string path);
    

    并且Page类具有DataContract属性,并且它的公共属性具有DataMember属性。

    我不愿意修改Reference.cs文件,因为每次更新服务时我都需要这样做。

    任何人都知道为什么会这样吗?

    斯图尔特。

3 个答案:

答案 0 :(得分:1)

当您添加服务引用时,您将获得“在程序集中重用类型”选项 - 这可能是整理重复的关键。

或者您是否有一些引起重复的测试参考?

另外,看看项目树的References部分,看看那里是否有任何意外的事件(你是否引用了两个在同一命名空间中都包含Service References的程序集?)。

答案 1 :(得分:1)

使用自动生成的代理类总是很痛苦。

为了处理这样的情况,我使用单独的程序集与数据契约类和服务接口。

合同dll将具有:


public interface IService
{
    [OperationContract]
    List GetContentList();
}

[DataContract]
public class ContentItem
{
  [DataMember] public string Name;
  [DataMember] public object Data;
}

客户端将引用Contract.dll。 代理将手动创建:


class ServiceProxy : ClientBase<IService>, IService
 {
  public List GetContentList()
  {
   return Channel.GetContentList();
  }
 }

服务器dll将引用相同的Contract dll。 因此,我们将能够避免自动生成代理的任何错误。 此外,手动创建的代理将更简单,更易于管理。

答案 2 :(得分:0)

添加服务参考时,请尝试单击高级,然后选择&#34;生成异步操作&#34;。

我认为发生的事情是Web服务中存在一些异步方法,名称以&#34; Async&#34;结尾,这将与References.cs中生成的方法冲突。

e.g。想象一下,Web服务包含两种方法:(1)SayHello和(2)SayHelloAsync

使用默认的基于任务的方法生成:

  • SayHelloSayHelloAsync for(1)
  • SayHelloAsyncSayHelloAsyncAsync for(2)。

发生冲突是因为有2个生成的方法称为SayHelloAsync

至少我认为这是怎么回事。无论如何设置&#34;生成异步操作&#34;为我工作。