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(); } }