Я использую 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-файле, и теперь я не получаю исключения. Я получаю правильное количество результатов в моем клиенте, но содержимое каждого класса кажется пустым.