2015-04-27 132 views
0

當我返回時Employee類正常工作,但我只需要幾個屬性,所以我試圖使它在瀏覽器上得到ERR_CONNECTION_REFUSED,但在代碼後面沒有錯誤。返回服務中的json對象

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "employees")] 
    public object GetEmployees() 
    { 
     var c = Employee.GetList().Select(x => new { id = x.Id, title = x.Title, person = x.FullName}); 
     return c; 
    } 


    [OperationContract] 
    object GetEmployees(); 

WebConfig

<service name="FOO.FOO.FOOService"> 
    <endpoint address="http://localhost:8733/FOOService" binding="webHttpBinding" contract="FOO.FOO.IFOOService" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8733/FOOService" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
+0

多放些細節到你的問題(確切的錯誤信息,錯誤位置等) –

+0

更新,這是我的所有的信息。現在,即使你可以建立一個樣本項目來測試。 – Mert

回答

3

你不能用默認的WCF串行使用匿名類型。如果您想要支持匿名類型,則必須創建自定義消息格式化程序(https://msdn.microsoft.com/en-us/library/ms733844.aspx)。

在你的情況,我建議創建EmployeeDTO(僱員數據傳輸對象)類型,其中將包括要從服務回報領域。然後,您可以將此類型用作GetEmployees方法的返回類型。

+0

我試圖避免這樣做:/ – Mert

+0

我可以理解這種感覺:)因爲你可能會得到很多DTO對象。另一方面,這些DTO對象的編寫和維護非常簡單。所以它們(在我看來)優於定製的消息格式器。 – drax

0

如果你真的不希望創建一個數據傳輸對象,這將是我的偏好,那麼我建議你返回從服務Dictionary<string,string>對象的列表。雖然有辦法讓WCF序列化與無類型的對象一起工作,但它們都不可維護或優雅。使用字典應該給你相同的靈活性,沒有這些問題。然後

你的代碼可以改寫爲:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "employees")] 
public List<Dictionary<string, string>> GetEmployees() 
{ 
    var c = Employee.GetList().Select(x => new Dictionary<string, string> {{"id", x.Id.ToString()}, {"title",x.Title}, {"person", "x.FullName"}}).ToList(); 
    return c; 
} 

不要忘了投字典的結果返回給你想要的類型的客戶端上。 我也建議在回答考慮看看這個問題: Passing an instance of anonymous type over WCF爲什麼通過匿名類型在導線的解釋是一個壞主意。