我收到一条错误消息:
合同属性无效。根据其数据类型'clientcontracttype',该值无效
以下是此WCF应用程序的web.config中的端点配置。我正在使用.NET Framework 4.5和Visual Studio 2012.我已经验证合同OnlineReporting.Core.Contracts.IReportingInternalWcfPortal
已经存在。
<endpoint address="http://localhost:63817/ReportingInternalWcfPortal.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding"
contract="OnlineReporting.Core.Contracts.IReportingInternalWcfPortal"
name="ReportingInternalPortal" />
我看到这个问题很老了,我不知道你现在是否找到了解决办法,但为了以防万一,这是我发现的将解决的问题:
1)在Solution Explorer中的Service References文件夹下,右键单击出现问题的服务引用名称,然后选择“Configure Service Reference”。
2)将出现“服务参考设置”窗口。取消选中标记为“在引用的程序集中重用类型”的框,然后单击“确定”按钮。
3)重建项目。
重建后,警告应该消失。
我发现这个问题在Web服务项目上寻找相同的错误。
在我的情况下,当我忘记在[ServiceContract]
界面上添加IServiceBase
属性时发生此错误。
一旦我在错误中添加它就消失了。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace MyService
{
[ServiceContract]
public interface IServiceBase
{
[OperationContract]
IEnumerable<ListItem> GetListItems();
[OperationContract]
void SaveListItems(IEnumerable<ListItem> listItems);
}
如果您在[包含.config]的项目中缺少对包含接口/服务合同的实际项目/库的引用,则会发生同样的错误...
在我的情况下,我通过无意中删除了一个对服务合同关键的接口来改变了服务合同。
几周后,我发现了一个破损的客户端,其中包含过时的服务参考。由于删除接口是错误的,我把它放回去了。
另一种可能的解决方案是重建服务引用以匹配新的服务契约(在我的情况下,由于引用的接口已被删除,因此会破坏项目构建)。
感谢OrangeKing89让我指向正确的方向。我知道服务合同有可能被改变。
在我的情况下,我有一个命名冲突。
当您添加服务引用时,visual studio会生成一个客户端类作为实现合同的代理,该代理的默认名称是“Client”附加的服务的名称,因此如果您的服务是“MyService”,则客户端类将是“MyServiceClient”。
我的问题是我的项目名称是“MyServiceClient”!这引起了这场冲突。
我意识到这是一个旧线程,但在我的情况下,问题是有人曾经一次为项目添加了服务引用,然后决定采取另一条路线,但条目仍然在web.config中,所以只是在web.config中删除该条目为我解决了这个问题。
我知道这个问题很古老,但我遇到了与C#和Visual Studio 2017相同的问题。一切正常,编译正常,然后就没有了。我将.Net 4.6.2降级到4.6,因为SQLite v108不支持108,然后我收到了这个错误和其他错误。我花了一些时间来追踪解决方案。我没有在任何地方看到我的解决方案,所以我认为我将它放在那里以备将来使用。
我删除了我的服务引用,检查了我对TFS的所有更改,然后添加了服务引用。然后我构建了解决方案,一切都很好。
我检查了app.config和其他文件,一切似乎都很好,只是没有构建。显然,VS2017在某处引入了.Net版本信息,但不是很明显。
希望我的解决方案可以帮助某人。
如果两个服务都包含在同一个解决方案中,则只需执行两个操作,前提是两个服务都在运行。
<services>
<service name="MyCurrentProject.Service" behaviorConfiguration="ConfigRest">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="restServicehttp" name="RestEndpoint" bindingName="webHttpBinding" contract="MyCurrentProject.Service"/>
</service>
<service name="AnotherPoject.Service" behaviorConfiguration="ConfigRest">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="restServicehttp" name="RestEndpoint" bindingName="webHttpBinding" contract="AnotherPoject.Service"/>
</service>
在我的情况下,代码是正确的,接口具有正确的[ServiceContract]标记,并且.config端点具有正确的接口名称空间,但是需要重新编译具有接口的项目,以便具有该接口的另一个项目.config文件将获取其bin文件夹中第一个项目的最新.dll。所以重新编译代码就是让visual studio开心的答案。