WCF - 在合同列表中找不到合同名称

时间:2010-01-16 14:31:30

标签: wcf

我对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'。

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

谢谢

6 个答案:

答案 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没有调用。