2012-05-27 1 views
8

Я использую Visual Studio 2010 и MS SQL Server 2005. Я новичок в WCF, и я стараюсь учиться при разработке маленькая задача управления приложение«Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом

на данный момент у меня есть решение с двумя консольными приложениями внутри него -. служба WCF - клиент подключение к службе WCF, чтобы проверить мой код

служба WCF подключается к db с использованием LINQ to SQL. Я реализовал OperationContract, который вставляет что-то в db позади службы WCF, и он работает. Я реализовал OperationContract, который возвращает GUID из службы WCF клиенту, и это тоже работает.

Когда я пытаюсь получить список список из службы WCF он терпит неудачу со следующей ошибкой:

  • «Произошла ошибка при получении ответа HTTP на локальном хосте: 8000/TaskerTest/Услуги/операции Это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP. Это также может быть вызвано тем, что сервер HTTP-запроса прерывается сервером

  • InnerException: базовое соединение было закрыто: произошла непредвиденная ошибка на принимаем.

Мои контракты (первые две работы. 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();

Я могу предоставить любые дополнительные данные по мере необходимости читателями.

UPDATE

Я свернула трассировку с

<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> 

Затем я запустить Microsoft Service Трассировка просмотра на сгенерированной журнал и получил следующее сообщение об ошибке:

Был ошибка при попытке сериализации параметра. Сообщение InnerException было «Тип» System.DelegateSerializationHolder + DelegateEntry 'с именем контракта с данными' DelegateSerializationHolder.DelegateEntry: http: //schemas.datacontract.org/2004/07/System 'не ожидается

Я добавил [DataContract] в класс «ToDoList» в моем dbml-файле, и теперь я не получаю исключения. Я получаю правильное количество результатов в моем клиенте, но содержимое каждого класса кажется пустым.

ответ

2

Мои классы базы данных были автоматически сгенерированы с использованием файла dbml (LINQ to SQL).

После того, как я добавил атрибут [DataContract()] в класс ToDoList в «TaskerModel.designer.cs» (автоматически сгенерированный файл), я больше не получал исключения, но классы, которые я получил на клиенте только значения по умолчанию для каждого члена.

Затем я добавил [DataMember()] атрибутов для всех членов класса ToDoList И добавил

[ServiceKnownType(typeof(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(); 
} 

И теперь он работает. Не знаю, есть ли более простой способ сделать это, но он работает сейчас. Если кто-нибудь знает лучший способ сделать это, я буду благодарен за комментарий.

0

У меня была такая же ошибка при вызове службы WCF restfull. Проблема, по-видимому, вызвана тем типом данных, который я возвращал в ответ.

Я вернул JSON, и у моего объекта ответа была переменная с типом данных DateTime. Когда я заменил DateTime на строку, проблема исчезла и вернул правильный ответ. Вероятно, это поможет кому-то, кто сталкивается с той же проблемой.

Заменить:

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

с этим

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

В моем случае проблема была, что существует только для чтения свойство. Добавьте пустой набор(); и решить мою проблему.

Смежные вопросы

 Смежные вопросы