我对WCF比较陌生。但是,我需要创建一个向Silverlight和AJAX客户端应用程序公开数据的服务。为了实现这一目标,我创建了以下服务作为概念证明:
[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'。
这是什么原因?我该如何解决这个问题?
谢谢
答案 0 :(得分:59)
您的合同是接口而非实施。
在配置中的某处,您编写了myService而不是IJsonService。
答案 1 :(得分:10)
从服务名称中删除命名空间。它会正常工作。
答案 2 :(得分:3)
修改您的web.config
您可以找到<services>
标记以及此标记的下方,您必须有另外两个标记:
<service ....
和
<endpoint ....
在<endpoint>
代码中,您必须引用您班级的界面。
例如:如果您的服务类名为CustomerSearch
,而您的接口名为ICustomerSearch
,则必须按以下方式进行配置:
<service name="CustomerSearch" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="ICustomerSearch"
behaviorConfiguration="ServiceAspNetAjaxBehavior">
答案 3 :(得分:1)
我有同样的问题,但我的解决方案是在我的web.config中,我指定了整个类名(包括名称空间),而WCF只接受类名。
这不起作用:
<services>
<service name="BusinessServices.Web.RfsProcessor">
这有效:
<services>
<service name="RfsProcessor">
答案 4 :(得分:1)
我之前遇到过ServiceModel framework 3.5的错误,我检查了主机的配置文件。我发现这是我的剪切和粘贴错误。我的服务指向的是一个旧的不存在的服务而不是我正在使用的服务。在我更正这些行后,它再次开始工作:
<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 合同接口 - &gt;
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();
}
}
答案 5 :(得分:0)
在web.config
文件中,<service
元素的name
属性需要是具有命名空间的服务类型名称,而不是程序集(Namespace1.Namespace2.Class
)。 <endpoint
元素的contract
属性同样具有名称空间限定的接口类型 - Namespace1.Namespace2.Interface
。
这也解决了所有行为诡计,例如CreateBehavior
BehaviorExtensionElement
没有调用。