【问题标题】:Visual Studio Express 2012 - Silverlight-Enabled WCF Service?Visual Studio Express 2012 - 启用 Silverlight 的 WCF 服务?
【发布时间】: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


【解决方案1】:

问题在于 DBContext 自动创建代理,这干扰了序列化。 代理在 DBContext 中默认开启,您可以在类构造函数中禁用它们

  this.Configuration.ProxyCreationEnabled = false;

或在创建 DBContext 实例之后

  using (var db = new myDBContext())
  {
    db.Configuration.ProxyCreationEnabled = false;

    ...
  }

还不知道为什么,但它确实有效。是时候阅读了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多