2012-05-23 44 views
3

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(); 
    } 

我得到錯誤:

"There was no endpoint listening at http://localhost:52602/TestService.svc/GetSomeNumber that could accept the message."

我懷疑,由於某種原因,使用GetSomeNumber方法我的電話是不是正確映射到uri/getnumber。爲什麼?我該如何解決這個問題,我錯過了什麼?

回答

0

我能想到的唯一問題是您的ITestService合同在WebChannelFactory客戶端代碼中不是最新的。

我在測試中注意到您使用WebInvoke的地方。 WebInvoke應始終放在您的ServiceContract接口)上,以便WebChannelFactory在通過REST進行通信時具有正確的URI。如果您將WebInvoke放在具體類別上(實現),那麼WebChannelFactory默認爲OperationContract名稱,如上所述。

+0

但這不是我想要實現的。你提出的建議改變了方法本身的名稱 - 當它與courese的uri相同時,它將起作用。但它並不總是這樣,我想知道如果不是這樣,該怎麼辦。 – agnieszka

+0

請參閱上面的編輯,這是您請求的映射缺失。 – SliverNinja

+1

你是否絕對確信?我今天看到一篇關於cpnsuming twitter休息服務的文章,他們同時使用了webchannel factory和沒有匹配合約名稱和uri(http://blogs.msdn.com/b/kaevans/archive/2008/07/26/creating -a休息,Twitter的客戶端與 - wcf.aspx)。你能否提供你所說的內容? – agnieszka