2011-10-04 133 views
2

我正試圖從我的Web服務中將用戶List<User>對象的通用列表綁定到我的Web應用程序。可能這是常見問題。我搜索了很多,但每個鏈接得到不同的補救措施。所以最後我決定要求在這裏... ...反正WCF從服務讀取數據問題

我使用控制檯應用程序從我託管的wcf Web服務中獲取數據。作爲我的WCf Web服務具有實體框架4.1。我正在使用它的模型類中的對象。當我試圖將服務引用添加到我的Web應用程序時,它通常會在Web應用程序中生成代理。我能夠發佈數據意味着我可以創建用戶。但同時getusers這是返回列表,獲得以下情況例外...:

例外:
在接收到 http://myserver/AdminService/MyAdminService.svc HTTP響應時發生錯誤。這可能是由於 服務端點綁定未使用HTTP協議。這也可能是由於服務器 中止HTTP請求上下文(可能由於服務關閉)。請參閱服務器日誌以獲取更多 的詳細信息。

內部異常是:
基礎連接已經關閉:發生意外錯誤 上的接收

和內內的例外是:無法從 傳輸連接中讀取數據:一個現有的連接被強行由遠程主機關閉 。

與消息:一個現有的連接被強行 遠程主機
錯誤代碼關閉:10054

凡爲事件日誌說:
未登錄的消息。
異常:System.ServiceModel.CommunicationException:嘗試序列化參數 http://tempuri.org/:getUsersResult時出現 錯誤。該消息的InnerException是 「類型 'System.Data.Entity.DynamicProxies.User_00DEC686D7E21DB0D84B595F647A03FFB4943938F76E8C3DBBE0F77F8BC29A1D' 數據合同名稱 'User_00DEC686D7E21DB0D84B595F647A03FFB4943938F76E8C3DBBE0F77F8BC29A1D:HTTP://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'預計不會出現 。考慮使用DataContractResolver或將任何未知的 類型靜態添加到已知類型的列表中 - 例如,使用KnownTypeAttribute屬性的 或將其添加到傳遞給DataContractSerializer的已知類型的 列表中。有關更多詳細信息,請參閱 InnerException。 ---> System.Runtime.Serialization.SerializationException:類型 'System.Data.Entity.DynamicProxies.User_00DEC686D7E21DB0D84B595F647A03FFB4943938F76E8C3DBBE0F77F8BC29A1D' 數據合同名稱 「User_00DEC686D7E21DB0D84B595F647A03FFB4943938F76E8C3DBBE0F77F8BC29A1D:HTTP://schemas.datacontract.org/2004/07/System .Data.Entity.DynamicProxies' 不是預期的。考慮使用DataContractResolver或通過使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型的 列表,將靜態未知的任何 類型添加到已知類型列表中 - 例如, 。 在 System.Runtime.Serialization。XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract,XmlWriterDelegator的XmlWriter,對象OBJ,布爾 verifyKnownType,的RuntimeTypeHandle declaredTypeHandle,類型 的declaredType) 在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator 的XmlWriter,對象OBJ,的RuntimeTypeHandle objectTypeHandle,類型 的objectType,的Int32 declaredTypeID,的RuntimeTypeHandle declaredTypeHandle,類型的declaredType) 在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator 的XmlWriter,對象OBJ,布爾isDeclaredType,布爾writeXsiType, 的Int32 declaredTypeID,的RuntimeTypeHandle declaredTypeHandle) 在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator 的XmlWriter,對象OBJ,布爾isDeclaredType,布爾writeXsiType, 的Int32 declaredTypeID,的RuntimeTypeHandle declaredTypeHandle) 在WriteArrayOfUserToXml(XmlWriterDelegator,對象, XmlObjectSerializerWriteContext ,CollectionDataContract) 在 System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator 的XmlWriter,對象OBJ,XmlObjectSerializerWriteContext上下文) 在 System.Runtime.Serialization.DataContractSerializ er.InternalWriteObjectContent(XmlWriterDelegator 作家,對象圖,DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,對象圖,DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions( XmlWriterDelegator 作家,對象圖,DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(的XmlDictionaryWriter 作家,對象圖) 在 System.ServiceModel.Dispatcher.DataContractSerializerOperation Formatter.SerializeParameterPart(的XmlDictionaryWriter 作家,PartInfo部分,對象圖) ---內部異常堆棧跟蹤的結尾--- 在 System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(的XmlDictionaryWriter 作家,PartInfo部分,對象圖) 在 System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter(的XmlDictionaryWriter 作家,PartInfo部分,對象圖) 在 System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody(的XmlDictionaryWriter 作家,MessageVersion版本,字符串動作,MessageDescription messageDescription,對象的returnValue,在 System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(的XmlDictionaryWriter 作家) 在 System.ServiceModel.Channels.BodyWriter.WriteBodyContents(的XmlDictionaryWriter對象[]參數,布爾 isRequest) 作家) 在 System.ServiceModel.Channels.Message.ToString(的XmlDictionaryWriter 作家) 在 System.ServiceModel.Diagnostics.MessageLogTraceRecord.WriteTo(XmlWriter的 作家) 在 系統。ServiceModel.Diagnostics.MessageLogger.LogInternal在 System.ServiceModel.Diagnostics.MessageLogger.LogMessageImpl(消息& 消息的XmlReader讀取器,MessageLoggingSource源) 在 System.ServiceModel.Diagnostics.MessageLogger.LogMessage(消息(MessageLogTraceRecord 記錄) & 消息,XmlReader中的讀者,MessageLoggingSource源) 進程名稱:W3WP 進程ID:5928

應該是什麼這個問題。我和團隊自3天以來一直在尋找這一點。但不幸的是迄今爲止還沒有克服...

我嘗試了很多東西像添加可串行化屬性,端點修改...我無法回憶所有:) ...可能你可能會給我們正確的方向...

回答

7

原因在於EF類默認在運行時進行代理以支持延遲加載和動態更改跟蹤。因此,在運行時,您不會序列化User類,而是從User衍生的類。 WCF不喜歡那樣。關閉您的上下文的代理創建。

context.Configuration.ProxyCreationEnabled = false; 
+1

Thanksk爲分享概念....這個概念對我來說真的是新的......我必須把這條線? –

+0

謝謝謝謝謝謝......我們在過去3天以來一直在撓頭......它的工作原理 –

+0

我不知道如何,但是現在這幫了我,謝謝! – Michael