0

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}; )、またはコンテキストにない型 (たとえば整数など) を返す場合、すべて正常に動作します。

これは高速版の制限ですか、それとも設定を忘れているのでしょうか? 過去に、VS 2010、Silverlight 4 でデータ サービスを使用する Silverlight アプリをいくつか作成しましたが、何か特別な設定をする必要があったことを覚えていません。

どんな助けでも大歓迎です!

編集: DbContext とそれがシリアル化される方法と関係がありますか? 以前に DbContext を使用したことがなく、常に EF 4 で既定の ObjectContext を使用していました...

EDIT2: 解決策 しばらく経ちましたが、他の作業がありました :o) 誰かが同じボートに乗っている場合、問題はサービスによるシリアル化にありました。DbContext はデフォルトでプロキシを作成しますが、これはシリアル化に同意しません。理由はまだわかりません-確かに、これらのプロキシについて自分自身を教育する必要があります-しかし、それらを無効にすると、シリアライゼーションの問題が解決します。Pawel さん、コメントありがとうございます。シリアライゼーションは問題ないと思い込んでいました。サーバー側のエラーを再確認したところ、正しい軌道に戻りました。

4

1 に答える 1

0

問題は、シリアライゼーションを妨げる DBContext による自動プロキシ作成にありました。プロキシは DBContext でデフォルトでオンになっています。クラス コンストラクターで無効にすることができます。

  this.Configuration.ProxyCreationEnabled = false;

またはDBContextのインスタンスを作成した後

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

    ...
  }

理由はまだわかりませんが、動作します。それについて読んでみましょう!

于 2013-01-22T02:41:47.813 に答える