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

6
我在Visual Studio 2008中有一个WCF服务项目,其中包含大约12个方法,其中一些返回原始类型,如bool或string。我还有一个引用发布的WCF服务的Visual Studio单元测试项目。当所有返回类型都是原始类型时,测试项目可以成功编译。
如果我向服务添加一个返回自定义类的新方法,并将其发布并更新Test Project中的服务引用,则无法编译。错误如下:-
  1. 类型“PublisherFaultException”已经包含“Reason”的定义。
  2. 类型“PublisherFaultException”已经包含“PropertyChanged”的定义。
  3. 类型“Publisher.Test.LibraryReference.PublisherFaultException”已经使用相同参数类型定义了名为“RaisePropertyChanged”的成员。
这些错误出现在自动生成的reference.cs文件中。
WCF服务方法的契约如下:-
Page GetItem(string path);

Page类具有DataContract属性,其公共属性具有DataMember属性。

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

有人知道为什么会发生这种情况吗?

斯图尔特。


发生的情况是,WCF添加服务引用真是个麻烦事 - 我能理解你的痛苦。 - JohnIdol
你尝试使用svcutil生成代理了吗?我记得以前遇到过这个问题,当时是在使用FaultContract属性创建自定义故障异常时出现的。我不记得解决方案了。希望我的评论能有所帮助。我会继续查找并看看能否找到解决方案。尝试使用SvcUtil.exe并查看发生了什么,然后告诉我们。 - CkH
3个回答

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。 因此,我们将能够避免自动生成代理时出现任何错误。 同时手动创建的代理将更简单、更易于管理。

1
当您添加服务引用时,会出现“在程序集中重用类型”的选项 - 这很可能是解决重复的关键。
或者,您是否有一些测试引用导致了重复?
此外,请查看项目树的引用部分,看看是否有意外的内容(您是否引用了两个包含相同命名空间中的服务引用的程序集?)。

“在所有引用程序集中重用类型”被选中。这是应该的吗?Page类属于一个程序集,虽然它在VS解决方案中,但测试项目并没有直接引用它。 - Stuart Whiteford
重复使用通常效果良好,尽管有长篇大论的争论,以避免以这种方式共享契约。PublisherFaultException是否在合同程序集中?它被标记为适当的Contract Attributes吗?(我没有看到您看到的确切情况,但我会通过跟踪引用路径来确定其根本原因)。 我猜您已经点击了项目浏览器顶部的显示所有文件按钮,并查看了references.cs以查看生成的代码,以确定它可能与什么冲突? - Ruben Bartelink
在更新服务引用时,PublisherFaultexception出现在自动生成的Reference.cs文件中。它包含两个类声明,均为PublisherFaultException(都是partial类,这很好),但都具有public Reason属性、PropertyChanged事件和RaisePropertyChanged方法。实际的ReportPublisherException类本身位于WCF项目中,并具有DataContact和DataMember属性。 - Stuart Whiteford
那么看起来问题在于“共享检测”没有发现它已经存在的事实。因此,我在上一个建议中提到你的 Fault 类缺少一个 Contract Attribute。我认为应该是 [FaultContract]... - Ruben Bartelink

0

在添加服务引用时,尝试点击“高级”并选择“生成异步操作”。

我认为问题出在 Web 服务中存在一些以 “Async” 结尾的异步方法,这些方法会与 References.cs 中生成的方法产生冲突。

例如,假设 Web 服务包含两个方法:(1)SayHello 和 (2)SayHelloAsync

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

  • (1) 会生成 SayHelloSayHelloAsync
  • (2) 会生成 SayHelloAsyncSayHelloAsyncAsync

冲突发生是因为有两个生成的方法都叫 SayHelloAsync

至少我认为是这样。无论如何,设置“生成异步操作”对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接