2010-08-17 66 views
2

我有一個定義了幾個操作合同的服務合同。我添加了一個新的端點來將我的操作公開爲一個安靜的web服務。而且我已經更新操作定義,使他們能夠在一個RESTful的方式被稱爲wcf 3.5 REST服務適用於XML但不適用JSON響應格式

[OperationContract] 
    [WebInvoke(
    Method = "GET", 
    ResponseFormat = WebMessageFormat.Xml, 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "product/getall")] 
    Product[] GetAll() 

一切正常,我的產品都以XML格式返回......但我想使用JSON代替。如果我將代碼更改爲

[OperationContract] 
[WebInvoke(
Method = "GET", 
ResponseFormat = WebMessageFormat.Json, 
BodyStyle = WebMessageBodyStyle.Bare, 
UriTemplate = "product/getall")] 
Product[] GetAll() 

對product/getall調用的響應爲空。沒有異常拋出,但我有一種不好的感覺,WCF JSON實現以某種方式無法應付序列化。任何人有類似的問題?有什麼建議麼?我有可能使用JSON.NET來序列化/反序列化我的對象嗎?

回答

1

打開WCF跟蹤並查看跟蹤日誌。這應該明確問題的出處。您可以使用以下設置來配置web.config以啓用跟蹤。

<system.serviceModel> 
    <diagnostics> 
     <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
</system.serviceModel> 

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Warning, ActivityTracing" 
     propagateActivity="true"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add name="ServiceModelTraceListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add name="ServiceModelMessageLoggingListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add initializeData="C:\Web_tracelog.svclog" 
     type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> 
     <filter type="" /> 
    </add> 
    <add initializeData="C:\Web_messages.svclog" 
     type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
     <filter type="" /> 
    </add> 
    </sharedListeners> 
</system.diagnostics> 
2

我能夠得到這個工作 - 這就是我所做的。首先,我的環境是VS2010,我使用的是VS Web服務器(Cassini)。

我沒有更改您的方法簽名或您的WebInvoke屬性。該GetAll()法的主體是這樣的:

[OperationContract] 
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "product/getall")] 
Product[] GetAll() 
{ 
    Product[] prods = new Product[3] { 
     new Product() { Name="Foo", Desc="Bar"}, 
     new Product() {Name="Ha", Desc="Ho"}, 
     new Product() {Name="Who", Desc="What"} 
    }; 

    return prods; 
} 

的web.config文件看起來是這樣的:

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="WebApplication2.ProdServiceAspNetAjaxBehavior"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WebApplication2.ProdService"> 
      <endpoint address="" behaviorConfiguration="WebApplication2.ProdServiceAspNetAjaxBehavior" 
       binding="webHttpBinding" contract="WebApplication2.ProdService" /> 
     </service> 
    </services> 
</system.serviceModel> 

老實說,大部分是默認出的現成功能。我唯一改變的是將endpointBehavior更改爲使用webHttp而不是默認enableWebScript。除此之外,它運行良好。

EDIT(忘了產品類):這裏的產品類 - 我飾它DataContractDataMember屬性:

[DataContract] 
public class Product 
{ 
    [DataMember()] 
    public String Name { get; set; } 
    [DataMember()] 
    public String Desc { get; set; } 
} 

這是我的輸出:

[{"Desc":"Bar","Name":"Foo"},{"Desc":"Ho","Name":"Ha"},{"Desc":"What","Name":"Who"}] 

我的猜測是您在web.config中使用enableWebScript。將其更改爲webHttp並查看會發生什麼情況。 enableWebScript設置用於更多ASMX類型的兼容性(我相信)。如果您要返回JSON(我的GET服務方法有很多),請使用webHttp(這是我以前使用的)。

讓我知道你得到了什麼,我會相應地更新我的答案。

相關問題