3

我有一个 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。为什么?我该如何解决这个问题,我错过了什么?

4

1 回答 1

0

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

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

于 2012-05-23T13:33:08.630 回答