2011-04-19 133 views
0
// Service file 

    [WebInvoke(UriTemplate = "Send/{country}", Method = "POST")] 
    public int Send(IFoo item, string country) 

// Interface file 
    public interface IFoo 
    { 
     string firstMember { get; set; } 
     string secondMember { get; set; } 
    } 

// Implementation file 
public class FooImpl : IFoo 
{ 
    string specificMember { get; set; } 
} 

我打電話給我的REST的服務與後上http://example.com/MyService/Send/ {COUNTRY}/
我希望能夠給一個IFoo的實現像文本/ XML參數:如何使用WCF REST公開接口?

<FooImpl xmlns="http://schemas.datacontract.org/2004/07/Hello"> 
    <firstMember>Hello</firstMember> 
    <secondMember>World</secondMember> 
    <SpecificMember>!</SpecificMember> 
</FooImpl> 

它當我在發送方法聲明中聲明FooImpl類型時工作,但在使用IFoo類型時不起作用。(錯誤400:錯誤的請求)
服務助手顯示:

<anyType xmlns:d1="http://www.w3.org/2001/XMLSchema" i:type="d1:schema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" /> 

所以,我不知道這是否是我的參數或實施問題XML問題...

回答

0

更新
好吧,似乎我原來的假設是錯誤的。即使已知的類型設置正確,我也會得到與您一樣的錯誤。顯然,DataContractSerializer默認不使用,添加行爲來選擇自定義序列化程序對REST端點沒有影響。我需要做一些進一步的挖掘......

原貼
這是一個有點複雜,使用的接口一個服務合同,因爲最終需要的數據進行反序列化到一個具體類型:接口不能實例化。

該解決方案的關鍵是已知類型。 DataContractSerializer需要知道在(序列化)過程中可能遇到的任何具體類型。

我創建了一個包含4個不同項目的小樣本。 ClientApp,接口,庫和服務。

接口包含IFooIService

包含FooImpl,因爲客戶端和服務器都需要訪問此類型。這個庫是'可插入的'。您可以即時添加更多的IFoo實施。

你猜怎麼着服務ClientApp含有:)

服務合同需要特殊KnownTypeAttribute:現在

[ServiceContract] 
[ServiceKnownType(typeof(IFoo))] 
public interface IService 
{ 
    [OperationContract] 
    string GetData(IFoo value); 
} 

,你可以配置你的應用程序實現的IFoo的具體類型。在客戶端和服務器上的配置(或任何它被稱爲):

<system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
      <add type="Interface.IFoo, Interface"> 
       <knownType type="Library.FooImpl, Library" /> 
      </add> 
     </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

如果您不需要這個可插拔結構,你應該能夠使用

[KnownType(typeof(FooImpl))] 

,而不是這整個複雜的結構。

如果我明天可以找到時間,我將使用它測試WCF REST,並將示例下載到某處。

+0

好的,謝謝你的幫助! – Spilarix 2011-04-20 05:31:16

+0

您是否找到解決方案? – Spilarix 2011-05-12 06:08:57

+0

@Spilarix我做了一些實驗,包括一些可怕的代碼,以修改設置注入數據合約序列化程序。這並沒有達到預期的效果。不幸的是我到目前爲止還沒有能夠進一步調查:( – Thorarin 2011-05-12 09:14:52