2011-11-02 56 views
1

我有一個自定義綁定具有下列服務合同的WCF服務,託管在IIS(IIS Express在開發中):WCF REST服務似乎不起作用 - 配置問題?

[ServiceContract] 
public interface IServer 
{ 
    [OperationContract] 
    StreamCollection GetStreams(Guid poolKey); 

    [OperationContract] 
    PoolCollection GetPools(); 

    [OperationContract] 
    StreamEntity GetStream(Guid poolKey, string localIndex);  
} 

它的工作原理確定(從客戶端,也是我可以看到它的元數據發現,確定在WCFTestClient) 。
我不得不暴露其作爲REST的功能,所以我創建了一個新的合同,如下

[ServiceContract] 
public interface IRestServer 
{ 
    [OperationContract(Name="GetStreamsREST")] 
    [WebGet(UriTemplate = "pool/{poolKey}/streams")] 
    StreamCollection GetStreams(string poolKey); 

    [OperationContract(Name = "GetPoolsREST")] 
    [WebGet(UriTemplate = "pools")] 
    PoolCollection GetPools(); 

    [OperationContract(Name = "GetStreamREST")] 
    [WebGet(UriTemplate = "pool/{poolKey}/stream/{localIndex}")] 
    StreamEntity GetStream(string poolKey, string localIndex); 
} 

我有同樣的服務類實現這兩個接口。 web.config文件是

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webHttp"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<bindings> 
    <customBinding> 
    <binding name="CustomBinding"> 
     <binaryMessageEncoding /> 
     <httpTransport maxReceivedMessageSize="655360" /> 
    </binding> 
    </customBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="MyServ.Server.Server"> 
    <endpoint address="" binding="customBinding" bindingConfiguration="CustomBinding" contract="MyServ.Server.IServer" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <endpoint address="rest" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="MyServ.Server.IRestServer" /> 
    </service> 
</services> 

但是,當我瀏覽使用REST訪問服務,戕URL像

http://localhost:<myport>/Service.svc/pools 
http://localhost:<myport>/Service.svc/pool/somekey/streams 
http://localhost:<myport>/Service.svc/pool/somekey/streams 

我得到錯誤404

我把BREAK-指向一些方法和附加的調試器到IIS進程,但似乎沒有任何東西被調用。

如果我使用WCFTestClient檢查服務元數據,它只會看到IService,而不會看到IRestService。這是正常的嗎? 編輯:是的,它似乎是(check this

謝謝你的任何建議。

+0

我假設你相同的服務實現兩個接口? –

+0

是的。這種方法可能存在問題? – bzamfir

+0

我打算建議如果它沒有同時實施,可能會有問題。 :) –

回答

1

謝謝大家的所有建議。 但是,我最終解決了這個問題。

問題是我不知道仍然是什麼問題,但我決定採取不同的和更「乾淨」的方式。

所以我所做的就是創建一個不同的服務SVC文件,RestServer,這裏我實現了REST方法

我修改網絡配置的設置有兩種不同的服務,一個是原來的(純WCF )和一個REST的一個,如下

<service name="MyServ.Server.RestServer" > 
    <endpoint address="" name="RESTEndpoint" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="MyServ.Server.IRestServer" /> 
</service> 

而且這並獲得成功。

其實,我應該用這種方法從一開始,以符合單一責任原則...

3

REST端點不以WCFTestClient可以使用的方式公開元數據,這就解釋了爲什麼你不能訪問它。你正在瀏覽的地址是不正確的,因爲你指定的端點地址REST端點「休息」,你需要訪問他們像

http://localhost:port/Service.svc/rest/pool/myPoolKey/streams 
http://localhost:port/Service.svc/rest/pools 
http://localhost:port/Service.svc/rest/myPoolKey/stream/1 

另一件事:在[OperationContract]屬性Name屬性對於REST端點無關緊要,所以你可以放棄它(儘管它並沒有傷害到它)。另外,如果你使用.NET 4.0,你甚至都不需要[OperationContract]屬性可言,因爲你已經有[WebGet],讓你的界面可以定義爲

[ServiceContract] 
public interface IRestServer 
{ 
    [WebGet(UriTemplate = "pool/{poolKey}/streams")] 
    StreamCollection GetStreams(string poolKey); 

    [WebGet(UriTemplate = "pools")] 
    PoolCollection GetPools(); 

    [WebGet(UriTemplate = "pool/{poolKey}/stream/{localIndex}")] 
    StreamEntity GetStream(string poolKey, string localIndex); 
} 
1

您能張貼您的你如何調用WCF服務的代碼?有一天,我有一個類似的問題,客戶端應用程序用HTTP POST而不是HTTP GET調用頁面,從而出現404錯誤。

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/GuessWhat")] 

VS

[WebGet(UriTemplate = "/GuessWhat/{variable}", ResponseFormat = WebMessageFormat.Json)] 

林不知道,如果你的服務有這樣或沒有,但確保正在實施的服務合同的有這個屬性。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
+0

我用簡單的URl調用服務,如http:// localhost:51996/RestServer.svc/streams/b639dffc-9198-4c0a-85f8-d66b1c11eb6a/lasttimestamp – bzamfir