2012-05-27 1 views
8

私はVisual Studio 2010とMS SQL Server 2005を使用しています。私はWCFを初めて使用しています。小さなタスク管理アプリケーション"トランスポート接続からデータを読み取ることができません:既存の接続がリモートホストによって強制的に閉じられました

私はそれ 内部の2つのコンソールアプリケーションとソリューション持っている瞬間 - 。WCFサービス - クライアントがWCFサービスに接続私のコードをテストするには、

WCFサービスは、に接続しdb to LINQ to SQLを使用しています。 WCFサービスの背後にあるデータベースに何かを挿入して動作させるOperationContractを実装しました。私は、WCFサービスからクライアントにGUIDを返すOperationContractを実装しました。これも動作します。

私はそれが次のエラーで失敗したWCFサービスからリストの一覧を取得しよう:ローカルホストへのHTTPレスポンスを受信して​​いる間

  • 」エラーが発生しました:8000/TaskerTest /サービス/オペレーションこれは、HTTPプロトコルを使用しないサービスエンドポイントのバインディングによるものである可能性があります。これは、HTTP要求コンテキストがサーバーによって中断されたために発生する可能性があります。

  • InnerException:基になる接続が閉じられました。

私の契約(最初の2つの仕事。 GetLists)が問題です:

実装:

public List<ToDoList> GetLists() { 
     Guid token = OperationContext.Current.IncomingMessageHeaders.GetHeader<Guid>("token", "ns"); 
     int? userID = CheckCache(token); 

     if (userID != null) { 
      List<ToDoList> lst = DBAccess.GetListsByUserId(userID.Value); 
      return lst; 
     } 
     else 
      return null; 
    } 

DBアクセスコード:

 public static List<ToDoList> GetListsByUserId(int idCredential) { 
     TaskerModelDataContext tmdc = new TaskerModelDataContext(); 
     List<ToDoList> lists = tmdc.ToDoLists.Where(entry => entry.id_Credential == idCredential).ToList<ToDoList>(); 
     return lists; 

    } 

そして、クライアントコード(WCFサービスは、にサービス参照として追加されますクライアントプロジェクト):

 TaskerService.LoginClient test2 = new LoginClient(); 
     string username = "usr1", password = "psw1"; 
     test2.ClientCredentials.UserName.UserName = username; 
     test2.ClientCredentials.UserName.Password = password; 

     Guid result = Guid.Empty; 
     try { 
      result = test2.CheckCredentials(username, password); 
      Console.WriteLine("Login OK!"); 
     } 
     catch (Exception e) { 
      Console.WriteLine(e.Message); 
     } 

     TaskerService.OperationsClient client = new OperationsClient(); 
     using(OperationContextScope contextScope = new OperationContextScope(client.InnerChannel)) { 

      Guid testToken = result; Console.WriteLine(testToken.ToString()); 
      MessageHeader<Guid> mhg = new MessageHeader<Guid>(testToken); 
      MessageHeader untyped = mhg.GetUntypedHeader("token", "ns"); 
      OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

      client.GetLists(); 
     } 
     client.Close(); 

上記の例外が発生してクライアントが失敗する:client.GetLists();

私は、読者が必要に応じて追加の詳細を提供できます。

ありました:私はその後、私は生成されるログにMicrosoftサービストレースビューアを実行すると、次のエラーを持っている

<system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="sdt" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "SdrConfigExample.e2e" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

でのトレースなってきました

UPDATE

パラメータを直列化しようとしているときにエラーが発生しました。私は今追加した

を期待されていない//schemas.datacontract.org/2004/07/System 『:のhttp:のInnerExceptionメッセージは、『データコントラクト名を持つ』「タイプ』 System.DelegateSerializationHolder + DelegateEntry DelegateSerializationHolder.DelegateEntryました[DataContract]を "ToDoList"クラスのdbmlファイルに追加しましたが、今は例外が発生しません。クライアントで正しい結果が得られますが、各クラスの内容は空であるようです。

答えて

2

私のデータベースクラスは、dbmlファイル(LINQ to SQL)を使用して自動生成されました。

"TaskerModel.designer.cs"(自動生成されたファイル)のToDoListクラスに[DataContract()]属性を追加した後、私はもう例外を受け取りませんでしたが、クライアントで取得したクラス各メンバーのデフォルト値のみを持っていました。

私はその後、[データメンバーは、()] todolistのクラスのすべてのメンバーに属性と

[ServiceContract(Namespace = "http://Tasker_Server")] 
    public interface IOperations { 
     [OperationContract] 
     string CreateList(string listName, string text); 
     [OperationContract] 
     string UpdateList(int idList, string listName, string text); 
     [OperationContract] 
     List<ToDoList> GetLists(); 
} 

[ServiceKnownType(typeof(ToDoList))] 

を追加しましたそして今、それが動作を追加。より簡単な方法があるかどうかは分かりませんが、現在は機能しています。誰かがこれを行う良い方法を知っているなら、私はコメントを感謝します。

0

WCF restfullサービスを呼び出すときに同じエラーが発生しました。この問題は、私が応答として返すデータ型に起因するようです。

私はJSONを返しました。私の応答オブジェクトは、データ型DateTimeの変数を持っていました。 DateTimeを文字列に置き換えると、問題がなくなり、適切な応答が返されました。おそらく、同じ問題を抱えている人を助けるでしょう。

は交換してください:私の場合はこの

[DataMember] 
public string dateFrom {get;set;} 
0

[DataMember] 
public DateTime dateFrom {get;set;} 

を問題は、読み取り専用プロパティがあったということでした。空のセットを追加する();私の問題を解決する。

関連する問題