WCF REST服务客户端调用映射到错误的Uris

时间:2012-05-23 13:16:53

标签: .net wcf rest

我有一个WCF REST服务,很简单,就像这样:

[ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        [WebInvoke(
           Method = "GET",
           UriTemplate = "getNumber")]
         int GetSomeNumber();
    }

public class TestService : TestServiceApp.ITestService
    {
        public int GetSomeNumber()
        {
            return 5;
        }
    }

配置如下:

<services>
      <service name="TestServiceApp.TestService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="restBehaviour" contract="TestServiceApp.ITestService" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="restBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

使用指定的Uri模板从浏览器调用它可以正常工作:

http://localhost:52602/TestService.svc/getnumber.

我像这样配置了我的客户端:

 <client>
      <endpoint name="TstSvc" address="http://localhost:52602/TestService.svc" binding="webHttpBinding" contract="TstSvc.ITestService" behaviorConfiguration="restBehaviour"/>
    </client>

  <behaviors>
    <endpointBehaviors>
      <behavior name="restBehaviour">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>

当我使用以下代码调用服务时:

    using (WebChannelFactory<ITestService> factory = new WebChannelFactory<ITestService>("TstSvc"))
    {
        var svc = factory.CreateChannel(); 
        svc.GetSomeNumber();
    }

我收到错误:

  

“没有端点在听   可以接受的http://localhost:52602/TestService.svc/GetSomeNumber   消息。“

我怀疑由于某种原因,使用GetSomeNumber方法的调用未正确映射到uri / getnumber。为什么?我怎么能解决这个问题,我错过了什么?

1 个答案:

答案 0 :(得分:0)

我能想到的唯一问题是ITestService合同在WebChannelFactory客户端代码中不是最新的。

我在测试中注意到你使用WebInvoke的地方很重要。应始终将WebInvoke放在ServiceContract接口)上,以便WebChannelFactory在通过REST进行通信时具有正确的URI。如果您将WebInvoke放在具体类(实现)上,则WebChannelFactory默认为您在上面观察到的OperationContract名称。