6

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

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

  1. “PublisherFaultException”类型已包含“原因”的定义。
  2. “PublisherFaultException”类型已包含“PropertyChanged”的定义。
  3. 类型“Publisher.Test.LibraryReference.PublisherFaultException”已经定义了一个名为“RaisePropertyChanged”的具有相同参数类型的成员。

全部在自动生成的 reference.cs 文件中。

WCF服务方法的约定是:-

Page GetItem(string path);

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

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

有谁知道为什么会这样?

斯图尔特。

4

3 回答 3

1

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

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

此外,请查看项目树的“引用”部分,看看其中是否有任何意外(您是否引用了 2 个在同一命名空间中都包含服务引用的程序集?)。

于 2009-10-29T10:07:17.767 回答
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。因此,我们将能够避免自动生成代理的任何错误。此外,手动创建的代理将更简单、更易于管理。

于 2010-10-14T10:35:47.347 回答
0

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

我认为发生的事情是Web服务中有一些异步方法,名称以“Async”结尾,这会与References.cs中生成的方法发生冲突。

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

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

  • SayHello对于( SayHelloAsync1)
  • SayHelloAsync对于(SayHelloAsyncAsync2)。

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

至少我认为这就是发生的事情。无论如何设置“生成异步操作”对我有用。

于 2014-09-05T08:39:06.517 回答