#wcf #asp.net-mvc-3 #entity-framework #odata
#wcf #asp.net-mvc-3 #entity-framework #odata
Вопрос:
Я абсолютный новичок в материалах, связанных с WCF, поэтому простите мой наивный вопрос, но я не уверен, с чего начать точное определение ошибки при изучении основ OData.
У меня есть существующее приложение MVC3, использующее базу данных, использующее поставщика универсального членства (добавленного через nuget) и небольшую базу данных SDF, доступ к которой осуществляется через SQL Server Compact Edition Client Data Provider 4.0. Я создал ее, выполнив следующие шаги:
1) создайте новый проект библиотеки для уровня данных, добавьте EDMX из базы данных, затем добавьте ADO.NET Шаблоны для создания контекста базы данных и объектов.
2) создайте новый проект библиотеки для общих интерфейсов данных: интерфейс репозитория, реализованный в (1), и шаблон entities t4 с его выводом, перенесенный из (1) в этот проект (изменив параметр TT inputFile таким образом, чтобы он ссылался на EDMX в другом проекте).
3) создайте новое приложение MVC, которое использует Ninject для создания экземпляра универсального репозитория, объявленного в (2), с репозиторием на основе SDF, реализованным в (1).
Веб-приложение работает нормально, и я могу просматривать и редактировать данные. Теперь я должен предоставить некоторые из его функций через службу WCF, и для этого я искал OData. Итак, я добавил новую службу передачи данных WCF и изменил сгенерированный код просто для его тестирования, добавив имя моего класса сущностей (как реализовано в (1)) и имя набора сущностей, например:
public class ProjectService : DataService<OrganizerEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Projects", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
В любом случае, когда я открываю SVC в браузере, я получаю ошибку запроса: сервер столкнулся с ошибкой при обработке запроса. Более подробную информацию смотрите в журналах сервера.. Если я посмотрю на журнал, я прежде всего увижу предупреждение вроде:
… http://msdn.microsoft.com/it-IT/library/System .ServiceModel.EvaluationContextNotFound.aspx Контекст оценки конфигурации не найден. …
и затем возникает исключение ArgumentNullException, подробности которого следуют ниже. Во всех примерах или руководствах, которые я нашел, я вижу типичный пример из не очень реального мира, где уровень данных не отделен от потребительского приложения: создайте новое приложение MVC, добавьте EDMX, добавьте службу данных WCF, измените несколько строк сгенерированного кода, и все волшебным образом заработает :). Итак, я полагаю, что это связано с моей многоуровневой архитектурой, особенно из-за предупреждения об отсутствии контекста. Может ли кто-нибудь помочь в использовании этой службы в многоуровневом сценарии, подобном этому? Спасибо!
… Значение не может быть нулевым. Имя параметра: ключ в системе.Коллекции.Общий.Словарь
2.FindEntry(TKey
2.get_Item (ключ TKey) в System.Data.Services.Поставщики.ObjectContextServiceProvider.PopulateMetadata (идентификатор
key) at System.Collections.Generic.Dictionary2
2 дочерних типа, идентификатор
knownTypes, IDictionary2 entitySets) at
1.CreateProvider() в System.Data.Services.Служба данных
System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
at System.Data.Services.DataService1.HandleRequest() at
1.ProcessRequestForMessage(потоковое сообщение) в SyncInvokeProcessRequestForMessage(объект , Object[] , Объект[]) в системе.ServiceModel.Диспетчер.SyncMethod Invoker.Вызов (экземпляр объекта, входные данные объекта [], объект[] и выходные данные) в системе.ServiceModel.Диспетчер.Время выполнения диспетчерской операции.Запуск вызова (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage5 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage41 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage4 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage31 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage3 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage2 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage11 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage1 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.MessageRpc.Process(логический набор isOperationContextSet) Система.Исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: ключ в системе.Коллекции.Общий.Словарь
System.Data.Services.DataService2.FindEntry(TKey key) at
2.get_Item (ключ TKey) в System.Data.Services.Поставщики.ObjectContextServiceProvider.PopulateMetadata (идентификатор
System.Collections.Generic.Dictionary2
2 дочерних типа, идентификатор
knownTypes, IDictionary2 entitySets) at
1.CreateProvider() в System.Data.Services.DataService
System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
at System.Data.Services.DataService1.HandleRequest() at
1.Обработайте запрос формы сообщения (Stream MessageBody) в SyncInvokeProcessRequestForMessage(Object , Object[] , Объект[] ) в системе.ServiceModel.Диспетчер.SyncMethod Invoker.Вызов (экземпляр объекта, входные данные объекта [], объект[] и выходные данные) в системе.ServiceModel.Диспетчер.Время выполнения диспетчерской операции.Запуск вызова (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage5 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage41 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage4 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage31 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage3 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage2 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage11 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage1 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.MessageRpc.Процесс (логический isOperationContextSet) …
System.Data.Services.DataService
Ответ №1:
Возможно, это не лучшее решение, но вот как мне удалось создать слой с EF и WCF:
-
Создайте свой проект приложения MVC.
-
Создайте новый проект веб-приложения, добавьте в этот проект свои модели сущностей и службы WCF. Отредактируйте события post build, чтобы скопировать соответствующие библиотеки dll из вашего bin / вместе с вашими файлами .svc в ваш проект MVC.
-
Создайте свой проект библиотеки, добавьте ссылки на свои службы. Используйте эту библиотеку из вашего приложения MVC. Убедитесь, что вы используете путь к файлу MVC .svc при создании экземпляров контекстов.