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重要であることに気付きました。REST 経由で通信するときに適切な URI を持つようWebInvokeに、常にServiceContract( interface )に配置する必要があります。具象クラス ( implementation ) にWebChannelFactory配置すると、デフォルトで上記の名前になります。WebInvokeWebChannelFactoryOperationContract

于 2012-05-23T13:33:08.630 に答える