【发布时间】:2013-01-02 23:11:18
【问题描述】:
我刚刚使用 Visual Studio Express 2012 for Web 开始了一个新的 Silverlight 项目。
我使用 EF 5 创建了一个启用 Silverlight 的 WCF 服务来访问 SQL Server 数据库。
我遇到的问题是该服务似乎无法返回从数据库中检索到的任何实体。返回一个新实体或任何旧对象就好了,但是当我尝试从上下文中返回一个实体时,我得到以下异常:
{System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassa.<EndGetResponse>b__9(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)
--- End of inner exception stack trace ---
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
--- End of inner exception stack trace ---
at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
at NewProj.DataSvcRef.DataServiceClient.DataServiceClientChannel.EndGetAgency(IAsyncResult result)
at NewProj.DataSvcRef.DataServiceClient.NewProj.DataSvcRef.DataService.EndGetAgency(IAsyncResult result)
at NewProj.DataSvcRef.DataServiceClient.OnEndGetAgency(IAsyncResult result)
at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}
服务方法代码再简单不过了:
[OperationContract]
public Contact GetContact(int aID)
{
Contact res = null;
using (var db = new OFBEntities())
{
try
{
res = db.Contacts.Find(aID);
}
catch (Exception ex)
{
res = null;
}
return res;
}
}
正如我所提到的,如果我返回一个新创建的对象(return new Contact(){ name="test contact};),或者返回一个不在上下文中的类型(比如一个整数例如),一切正常。
这是 Express 版本的限制,还是我忘记了某些设置?过去我用 VS 2010、Silverlight 4 创建了一些使用数据服务的 Silverlight 应用程序,但我不记得需要设置什么特别的东西,但也许我只是忘记了我做过?
感谢任何帮助!
编辑: 它与 DbContext 及其序列化方式有什么关系吗?之前没用过DbContext,EF 4里一直用默认的ObjectContext...
EDIT2:解决方案 已经有一段时间了,但我还有其他事情要做:o) 如果有人在同一条船上,问题出在服务的序列化中。 DbContext 默认创建代理,不同意序列化。我还不确定为什么——事实上,我需要对这些代理进行自我教育——但是禁用它们可以解决我的序列化问题。 感谢 Pawel 的评论,我错误地认为我的序列化工作正常,重新检查服务器端错误让我回到了正确的轨道上。
【问题讨论】:
-
您确定您的服务正在运行吗?
-
我确定 :o) 正如我所说,服务已被调用,我可以单步执行它,如果返回值不是来自上下文,它会按预期返回。可能是因为 EF 5 现在默认使用 DbContext - 我之前的经验是使用 EF 4,当时只有 ObjectContext?
-
我在堆栈跟踪中看不到任何与实体框架相关的内容。我不是 WCF 专家,但在我看来,您显示的堆栈跟踪来自客户端,而服务器端发生异常。如果您从服务器端显示异常/堆栈跟踪,则应该更容易弄清楚发生了什么。添加到您的编辑中 - 如果启用了代理,则可能无法序列化实体,因为它们具有对不可序列化对象的引用。
标签: wcf entity-framework silverlight-5.0