Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回自定义类的WCF服务在Reference.cs中生成错误_C#_Visual Studio 2008_Wcf_Datacontract - Fatal编程技术网

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

C# 返回自定义类的WCF服务在Reference.cs中生成错误,c#,visual-studio-2008,wcf,datacontract,C#,Visual Studio 2008,Wcf,Datacontract,我在VisualStudio2008中有一个WCF服务项目,它包含大约12个方法,其中一些方法返回bool或string等基本类型。我还有一个VisualStudio单元测试项目,它引用了已发布的WCF服务。当所有返回类型都是基元时,测试项目将成功编译 如果我向返回自定义类的服务添加一个新方法,发布它并在测试项目中更新服务引用,它就不会编译。错误是:- 类型“PublisherFaultException”已包含“Reason”的定义 类型“PublisherFaultException”已包含

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

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

  • 类型“PublisherFaultException”已包含“Reason”的定义
  • 类型“PublisherFaultException”已包含“PropertyChanged”的定义
  • 类型“Publisher.Test.LibraryReference.PublisherFaultException”已使用相同的参数类型定义了名为“RaisePropertyChanged”的成员
  • 所有文件都位于自动生成的reference.cs文件中

    WCF服务方法的合同为:-

    Page GetItem(string path);
    
    Page类具有DataContract属性,其公共属性具有DataMember属性

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

    有人知道为什么会这样吗


    Stuart.

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

    或者您是否有一些导致重复的测试引用


    另外,请查看项目树的“引用”部分,并查看其中是否有任何意外内容(是否有对两个程序集的引用,这两个程序集都包含同一命名空间中的服务引用?)。

    使用自动生成的代理类总是很麻烦

    为了处理这种情况,我使用带有数据协定类和服务接口的单独程序集

    合同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();
      }
     }
    
    
    
    类ServiceProxy:ClientBase,iSeries设备
    {
    公共列表GetContentList()
    {
    返回Channel.GetContentList();
    }
    }
    
    服务器dll将引用同一合约dll。 因此,我们将能够避免任何错误与自动生成的代理。
    此外,手动创建的代理将更简单、更易于管理。

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

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

    e、 假设web服务包含两种方法:(1)
    SayHello
    和(2)
    SayHelloAsync

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

    • (1)的
      SayHello
      SayHelloAsync
    • (2)的
      SayHelloAsync
      SayHelloAsyncAsync
    发生冲突的原因是有两个生成的方法称为
    SayHelloAsync


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

    选择了“在所有引用程序集中重用类型”。应该是这样吗?Page类属于一个程序集,当它在VS解决方案中时,测试项目不会直接引用它。重用是通用的,尽管有[冗长的]论据支持以这种方式避开共享契约。合同程序集中是否存在PublisherFaultException?是否用适当的合同属性标记?(我还没有看到你看到的确切案例,但我会通过追踪参考资料来找出根本原因)。我认为您已经单击了project explorer顶部的“显示所有文件”按钮,并查看了references.cs以查看生成的代码,以确定它可能与什么冲突?更新服务引用时,PublisherFaultexception位于自动生成的Reference.cs文件中。它包含PublisherFaultException的两个类声明(两个部分类都可以),但都具有public Reason属性、PropertyChanged事件和RaisePropertyChanged方法。实际的ReportPublisherException类本身在WCF项目中,并且具有DataContact和DataMember属性。那么,问题似乎在于“共享检测”没有检测到它“已经存在”的事实。因此,我在上一篇文章中建议,在Fault类中缺少一个Contract属性。认为这是[FaultContract]…现在发生的是WCF add service reference是一个婊子-我觉得你的痛苦你是否尝试过使用svcutil生成代理?我记得以前有过这个问题,那是在我使用FaultContract属性创建自定义故障异常时。我不记得解决办法了。希望我的评论能有所帮助。我会继续挖掘,看看能不能找到解决办法。请尝试SvcUtil.exe,查看发生了什么,并通知我们。