2013-04-04 9 views
7

へのHTTP応答の受信中にエラーが発生しましたdownvoteの前に、このような質問が重複していることがわかりましたが、試してみて解決策を見つけることに成功しませんでしたそれら。私は何かを逃したかもしれませんが、まだWCFには比較的新しいので、いくつかは私の頭を少し上回ります。WCF - http:// xxxxx/Service/

私は私のWCFサービスでこのコールを作っています:

public User GetStudentRecord(string userName) 
    { 
     try 
     { 
      return new DashboardFacade().GetStudentRecord(userName); 
     } 
     catch (Exception ex) 
     { 
      ServiceFault fault = new ServiceFault(); 
      fault.Operation = "GetStudentRecord"; 
      fault.Reason = "Who knows..."; 
      fault.Message = ex.Message; 
      throw new FaultException<ServiceFault>(fault, fault.Message, new FaultCode(fault.Reason), fault.Operation); 
     } 
    } 

DashboardFacade()GetStudentRecord(..)はこのように定義されています。

public User GetStudentRecord(string userName) 
{ 
    User user = ctx.Users.Where(x => x.ADUserName == userName).SingleOrDefault(); 
    return user; 
} 

CTXは私のDbContextです。 Entity Framework Code Firstを使用しています。 Userオブジェクトは、次のようになります。

public class User 
{ 
    public User() 
    { 
     //UserDetails = new UserDetail(); 
    } 
    [Key] 
    public Guid MasterKey { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string ADUserName { get; set; } 
    public string UserType { get; set; } 
    public virtual UserDetail UserDetails { get; set; } 
    public Nullable<DateTime> LastModifiedDate { get; set; } 
} 

そして最後に、あなたはおそらくWCFアプリケーションにweb.configファイルを参照する必要があります。

<?xml version="1.0"?> 
    <configuration> 
     <connectionStrings> 
     <add name="NotMyDBContextDB" connectionString="[omitted]" providerName="System.Data.SqlClient"/> 
     <add name="ApplicationContext" connectionString="Data Source=.;Initial Catalog=MyApp;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> 
     </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true"/> 
<directoryBrowse enabled="true"/> 
</system.webServer> 
</configuration> 

誰も私が間違ってここつもりどこに私を指すことができますか?あなたが返されたユーザーオブジェクトのいくつかのフィールドにアクセスしようとすると、

An error occurred while receiving the HTTP response to http://localhost:5843/MyService.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 

Inner Exception: 
The underlying connection was closed: An unexpected error occurred on a receive. 

Inner Exception: 
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. 

Inner Exception: 
An existing connection was forcibly closed by the remote host 
+0

エラーはどこに投げられますか?デバッガでサービスを実行します。 – dthorpe

+0

エラーメッセージと内部例外メッセージが追加されました。私はデバッガでそれを実行することができ、それは私が上に持っているすべてのコードをステップ実行することができます。実際のサービスでGetStudentRecord()を呼び出すと、数秒後にエラーが発生します。 – ledgeJumper

答えて

8

方法素敵な天気は外です。 Userオブジェクトの内部にあるUserDetailsオブジェクトからvirtualキーワードを削除します。

これで機能します。

なぜこの問題が発生したかというと、私の前提はシリアライゼーションまたはDbContextの問題ですが、私はそれを詳しく見なければなりません。

私は今外出しています。参照のためにそう

、あなたがここに巻き取って、あなたが(サイズ、タイムアウトなど)を見てみなければならない他のすべてのものの中で、何が起こっているか見当がつかない場合:メソッドの

Check to see if your object has virtual keyword on it. 
+0

私はこの答えを見つけるのに全日中かかりました。ありがとうございました! –

+0

あなたは天使です。私はまた、これで一日中無駄にしています。ヒントありがとうございます。 – stakx

0

あなたの例外が起こるん:

これは私が取得しています正確なエラーですか?

もしそうなら、あなたのctxオブジェクトは、GetStudentRecord()の呼び出し後にあなたのサービスによって閉じられているように見えます。どこでctxを作成していますか、それをどのように開閉していますか? (50担当者の要件に私が...コメントでこれを置くことができなかったので、代わりに答えとしてここにあるDUE)の宣誓の多くと思考の後に根本的な原因を発見

+0

メソッドが内部にあるクラスでコンテキストが作成されています。これは、wcfサービス自体とは別のクラスライブラリにあります。したがって、クラスが初期化すると、コンテキストが作成されます。 DashboardFacadeクラスには、基本的に同じことをしているが、Userオブジェクトではなく、異なるオブジェクトのリストを返す2つのメソッドがあります。だから私はそれが文脈に関係することを知らない。 – ledgeJumper

+0

私は上記の_dthorpe_と同じ質問をしています:どこから例外がスローされますか?あなたはGetStudentRecord()のキャッチに着陸していますか、または別のエリアからの例外はありますか? – TomEddie

+0

例外は私が見ていたコードではなく、他の場所にスローされていました。それは私が上に投稿したすべての方法でうまくいった。 – ledgeJumper

0

なし私のために働いた。私がしたのは、WCFテストクライアントから実行している間にサービスをデバッグすることでした。問題を見つけることができました。これは、サービスライブラリがapp.config内の接続文字列を紛失したことと関係していました。

誰かが他の方法を試しても問題を見つけられない場合は、ポストするだけです。

1

私は同じエラーがありました。

私の場合、OEMと呼ばれるint列のテーブルがあります。 モデルレイヤーでは、その列が列挙型で表されるクラス(DTO)があります。 OEM列内の値が有効ではない行がテーブルにありました。 LINQを使用してすべてのデータを取得しようとしたとき、VisualStudioでキャプチャされなかったエラーがありました。 WCFがメッセージを取得しようとしたときにエラーが発生しました。

4

私の場合、問題はWCFサービスがgetterとsetterだけのプロパティを持つクラスを返すことでした。私は、プロパティが受信者によって変更されないようにしようとしていました。この問題を回避するには、こちらを参照してください。

WCF Services and Object Constructors
+0

それは私を救った!実際のエラーは、null参照例外をスローしていた読み取り専用プロパティによって引き起こされました...しかし、これはすべて深く隠されていました。 WCFの狂気! – Schalk

関連する問題