C# 返回自定义类的WCF服务在Reference.cs中生成错误
我在VisualStudio2008中有一个WCF服务项目,它包含大约12个方法,其中一些方法返回bool或string等基本类型。我还有一个VisualStudio单元测试项目,它引用了已发布的WCF服务。当所有返回类型都是基元时,测试项目将成功编译 如果我向返回自定义类的服务添加一个新方法,发布它并在测试项目中更新服务引用,它就不会编译。错误是:-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”已包含
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,查看发生了什么,并通知我们。