성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류</h1> <p> EF 4.1의 Code First 쿼리 결과를 WCF를 통해 노출시킬 때, 메서드가 Code First 관련 타입을 반환하는 경우 다음과 같은 오류가 발생하게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>System.ServiceModel.EndpointNotFoundException was unhandled</span> <span style='color: blue; font-weight: bold'>Message=There was no endpoint listening at http://.../TestWebService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.</span> StackTrace: at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result) at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2) at System.Threading.ThreadPool.WorkItem.doWork(Object o) at System.Threading.Timer.ring() <span style='color: blue; font-weight: bold'> InnerException: System.Net.WebException Message=The remote server returned an error: NotFound. </span> </pre> <br /> 테스트용으로 만든 동일한 웹 서비스 내의 다른 메서드들이 정상적으로 호출되는 것으로 봐서는 그 메서드에서만 문제가 있는 듯했습니다. 좀 더 원인을 찾기 위해, Fiddler로 해당 웹 메서드를 호출할 때의 응답 패킷을 살펴보니 다음과 같이 확인됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HTTP/1.1 504 Fiddler - Receive Failure Content-Type: text/html; charset=UTF-8 Connection: close Timestamp: 06:38:50.246 <span style='color: blue; font-weight: bold'>ReadResponse() failed: The server did not return a response for this request.</span> </pre> <br /> 음... 일단, 클라이언트 측에 정상적으로 SOAP 응답이 내려오지도 않은 걸로 봐서는 웹 메서드 결괏값이 직렬화되면서 발생하는 것 같아 보였습니다. 그래서, 반환하게 될 EF CodeFirst에 참여된 결괏값을 수작업으로 직렬화 해보았습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > try { MemoryStream ms = new MemoryStream(); DataContractSerializer dcs = new DataContractSerializer(typeof(TestObj)); dcs.WriteObject(ms, item); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.ToString()); } </pre> <br /> 영락없이, dbgview에는 다음과 같은 오류 메시지가 확인되었습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> <span style='color: blue; font-weight: bold'>System.Runtime.Serialization.SerializationException: Type 'System.Data.Entity.DynamicProxies.TestSource_F8AD1CA74BDE30D0189369342F1C50E8EEDDE226E498D4FFDF99220F3B969334' with data contract name 'TestSource_F8AD1CA74BDE30D0189369342F1C50E8EEDDE226E498D4FFDF99220F3B969334:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.</span> at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) <br /> at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) <br /> at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) <br /> at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) <br /> at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) <br /> at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph) <br /> at TestService.TestWebService.GetTestList(String text) in D:\...\TestWebService.svc.cs:line 42 <br /> </div><br /> <br /> 이 정도 구체적인 오류 메시지면 이제 구글의 도움을 받아도 될 것 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Exposing POCO entity from EFDM through WCF to client ; <a target='tab' href='http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/1c37447a-e303-4947-a3ee-d2e6592aac0a'>http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/1c37447a-e303-4947-a3ee-d2e6592aac0a</a> </pre> <br /> 아하... 결국 EF가 반환해 준 개체가 실제 개체와의 매개 역할을 해주는 Proxy 개체이기 때문에 이를 직접적으로 직렬화하는 경우 DynamicProxies 개체 자체는 직렬화할 수 없는 개체이므로 문제가 발생하는 것입니다. 어쩌면 예전에 살펴본 WPF에서의 WCF 사용과 유사한 문제같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WPF + WCF 환경에서는 DataContract를 권장 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/612'>http://www.sysnet.pe.kr/2/0/612</a> </pre> <br /> 자, 그럼 해결책으로 주어진 것 중에 ProxyCreationEnabled 속성을 false로 지정하는 것이 가장 적당한 해결책으로 보입니다. 그런데, 위의 글에서는 POCO를 기준으로 나온 해결책이라서 실제로 Code-First에서는 그와 같은 속성은 없고, 대신 Configuration 속성 하위에 제공되고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public class DBContext : DbContext { public DBContext() { this.<span style='color: blue; font-weight: bold'>Configuration.ProxyCreationEnabled = false;</span> } } </pre> <br /> 그래서, 위와 같이 적용하고 나면 이제 정상적으로 WCF 호출이 이뤄집니다. ^^ 그래도 혹시나 싶어, 이 속성의 설정으로 인해 뭔가 더 부작용이 있지 않을까 싶어서 검색을 해보니 다음의 글이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > What are the downsides to turning off ProxyCreationEnabled for CTP5 of EF code first ; <a target='tab' href='http://stackoverflow.com/questions/4596371/what-are-the-downsides-to-turning-off-proxycreationenabled-for-ctp5-of-ef-code-fi'>http://stackoverflow.com/questions/4596371/what-are-the-downsides-to-turning-off-proxycreationenabled-for-ctp5-of-ef-code-fi</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> Dynamic proxies are used for change tracking and lazy loading. When WCF tries to serialize object, related context is usually closed and disposed but serialization of navigation properties will automatically trigger lazy loading (on closed context) => exception. <br /> <br /> If you turn off lazy loading you will need to use eager loading for all navigation properties you want to use (Include on ObjectQuery). Tracking changes doesn't work over WCF it works only for modification of entity which is attached to ObjectContext.<br /> </div><br /> <br /> 결국 제가 판단하기에는, 완전히 WCF와 같은 환경에서 직렬화를 위해 나온 속성이라고 보여질 정도이니 안심하고 사용해도 되겠습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1632
(왼쪽의 숫자를 입력해야 합니다.)