2013-07-11 37 views
7

我在將對象序列化爲JSON時遇到問題,並且對於WCF來說是新手,我在調試方面從何處開始有問題。如果我通過在瀏覽器中輸入網址來訪問該服務,則無法使用該頁面。調試不會序列化對象的WCF服務

該場景:我有A類繼承B類列表如果我在A級註釋中增加它的集合,我至少可以打到服務(顯然沒有數據存在),但是如果它增加了它的集合,我就不能再訪問該服務。

接口:

<OperationContract()> _ 
<WebGet(UriTemplate:="getAdverseReactions", responseFormat:=WebMessageFormat.Json)> _ 
<ServiceKnownType(GetType(AdverseReactions))> _ 
<ServiceKnownType(GetType(AdverseReaction))> _ 
Function GetAdverseReactions() As AdverseReactions 

實現接口:

Public Function GetAdverseReactions() As AdverseReactions Implements IPortalCoreService.GetAdverseReactions 
    Return CoreServiceController.GetAdverseReactions()//which returns class A 
End Function 

A類:

<CollectionDataContract(Name:="AdverseReactionsCollection", ItemName:="AdverseReaction")> _ 
Public Class AdverseReactions 
Inherits List(Of AdverseReaction) 

B類:

<DataContract(IsReference:=True)> _ 
Public Class AdverseReaction 

我通過附加一個進程來遍歷代碼,並且沒有拋出異常,我可以確認這些對象是應該返回的,我顯然不能序列化它。我讀過關於循環引用的內容,我的一位朋友建議這兩個類可能會以無限的方式彼此序列化。

我的主要問題:是否有一個地方我可以看看爲什麼會發生這種情況,或至少有一些關於它的信息?這個問題一直在處理我,我想要的只是序列化這個,當我這樣做,我想我會花一週假期:)。

+0

它是否必須是一個'WCF'服務或者是你選擇實現它? –

+0

@KarlAnderson是的。我正在使用現有的代碼庫。 –

回答

11

以下塊添加到你的web.config <configuration>

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\log\WebTrace.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

,並確保指定的目錄( c:\ log)存在並且可由IIS服務寫入。

完成此操作後,執行導致序列化問題的操作,然後導航到該目錄,然後雙擊生成的svclog文件。

這將打開Microsoft Service Trace Viewer中的文件。一旦打開,您將在左側看到以紅色顯示的錯誤。

單擊其中一個將在右上窗格中顯示詳細信息,並且您可以單擊每個操作以確定WCF在抱怨什麼。

+0

太棒了,謝謝! –

+0

這太棒了。但是有沒有辦法看到我們試圖解析的json? –