WCF – 合同名称不能在合同列表中find

我对WCF比较陌生。 不过,我需要创build一个将数据公开给Silverlight和AJAX客户端应用程序的服务。 为了达到这个目的,我创build了以下服务来作为概念certificate:

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] public interface IJsonService { [OperationContract] [WebInvoke(Method = "GET", RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] List<String> JsonFindNames(); } [ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] public interface IWsService { [OperationContract(Name="FindNames")] List<String> WsFindNames(); } [ServiceBehavior(Name="myService", Namespace="urn:MyCompany.MyProject.Services")] public class myService : IJsonService, IWsService { public List<String> JsonFindNames() { return FindNames(); } public List<String> WsFindNames() { return FindNames(name); } public List<string> FindNames() { List<string> names = List<string>(); names.Add("Alan"); names.Add("Bill"); return results; } } 

当我尝试访问此服务时,我收到以下错误:

在服务“myService”实现的合同列表中找不到合同名称“myService”。

这是什么原因? 我该如何解决?

谢谢

你的合同是Interface而不是执行。

在configuration的某个地方,你写了myService而不是IJsonService。

从服务名称中删除名称空间。 它会正常工作。

修改你的web.config你可以find<services>标签和下面的这个标签,你必须有另外两个标签:

<service ....<endpoint ....

<endpoint>标记中,您必须引用您的类的接口。

例如:如果您的服务类名为CustomerSearch而您的接口名为ICustomerSearch ,则必须如下configuration:

  <service name="CustomerSearch" behaviorConfiguration="ServiceBehavior"> <endpoint address="" binding="webHttpBinding" contract="ICustomerSearch" behaviorConfiguration="ServiceAspNetAjaxBehavior"> 

我有同样的问题,但我的解决scheme是在我的web.config中,我指定了整个类名称(包括命名空间),而WCF将只接受类名称。

这不起作用:

 <services> <service name="BusinessServices.Web.RfsProcessor"> 

这工作:

 <services> <service name="RfsProcessor"> 

web.config文件中, <service元素的name属性需要是名称空间的服务types名称,而不是程序集( Namespace1.Namespace2.Class )。 <endpoint元素的contract属性同样具有名称空间限定的接口types – Namespace1.Namespace2.Interface

这也解决了所有的行为CreateBehavior ,像CreateBehavior不在BehaviorExtensionElement上调用。

我有ServiceModel框架3.5之前的错误,我检查了我的主机的configuration文件。 我发现这是我的剪贴错误。 我的服务是指向一个旧的不存在的服务比我正在使用的服务。 在我纠正了下面的这些行之后,它再次开始工作:

 <system.serviceModel> <services> <!--<service name="NotUsed.Serv">--> <service name="InUse.MyService"> <host> <baseAddresses> <!--<add baseAddress="http://localhost:8181/LastService" />--> <add baseAddress="http://localhost:8181/InUseService"/> </baseAddresses> </host> </service> </services> </system.serviceModel> 

请注意,MyService必须是ServiceModel 3.5中的合同类的名称,但是它是Framework 4.0中的IMyService合同接口 – >

 namespace InUse { [ServiceContract] public interface IMyService { [WebGet(UriTemplate = "/GetList/{PATTERN}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] [OperationContract] List<string> GetIDListByPattern(string PATTERN); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class MyService : IMyService { List<string> MySample = (new _PointRT()).Sample().Select(r=>r._pointXID).ToList(); public List<string> GetIDListByPattern(string PATTERN) { return MySample.Where(x => x.Contains(PATTERN)).ToList(); } }