2011-09-21 40 views
1

我有一個自託管WebServiceHost像這樣定義的:如何在WebServiceHost中調試序列化錯誤?

var baseWebHttpBindingBase = "http://localhost:8085/MyService"); 

var wsEndPoint = new EndpointAddress(baseWebHttpBindingBase); 
var binding = new WebHttpBinding(); 

wsHost = new WebServiceHost(lsWsService, new Uri(baseWebHttpBindingBase)); 

wsHost.Faulted += new EventHandler(wsHost_Faulted); 
wsHost.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(wsHost_UnknownMessageReceived); 

ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>(); 
sdb.IncludeExceptionDetailInFaults = true; 

// Mex endpoint 
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior(); 
mexBehavior.HttpGetEnabled = true; 
wsHost.Description.Behaviors.Add(mexBehavior); 
wsHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), baseWebHttpBindingBase + "mex"); 

wsHost.Open(); 

我有一個OperationContract定義:

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, Method = "PUT", UriTemplate = "/handShake")] 
public ConfigSettings handShake(ClientInformationDto clientInfo) { 
    var configSettings = new ConfigSettings(); 
    // set configSettings values; 

    return configSettings; 
} 

ConfigSettings有一些雜項。屬性,主要定義爲字符串和整數。有一個屬性,雖然名爲complexClasses類型List<ComplexClass> - 如果complexClasses爲null,那麼客戶端可以使用webservice很好。但是,如果我填充complexClasses,嘗試使用webservice永遠不會完成 - 在Fiddler中觀看它只顯示一個通用的ReadResponse() failed: The server did not return a response for this request.

當我調試代碼時,我得到return語句,並且當我執行最後一步時,提琴手報告以上錯誤。

我知道問題與configSettings中的我的ComplexClass有關。該服務繼續運行良好,甚至在啓用Studio的「打破所有例外」功能後,任何事情都不會中斷。無論如何調試返回後(最有可能在序列化階段)導致我的服務無法返回任何東西后發生的任何事情?

+0

最好的辦法是在您的應用程序中啓用跟蹤(http://msdn.microsoft.com/zh-cn/library/ms733025.aspx);序列化錯誤將顯示在跟蹤文件中。 – carlosfigueira

回答

1

ComplexClass可能沒有正確序列化。 ComplexClass需要使用序列化屬性進行公開。

[DataContract] 
    public class ComplexClass 
    { 
     [DataMember] 
     public string Field { get; set; } 
    }