我是WCF相关内容的全新手,所以请原谅我天真的问题,但我不知道在学习OData基础知识时,从哪里开始查明错误。
我有一个使用数据库的现有MVC3应用程序,使用通用成员资格提供程序(通过nuget添加)和通过SQL Server Compact Edition客户端数据提供程序4.0访问的小型SDF数据库。我用以下步骤创建了它:
1)为数据层创建新库项目,从数据库添加EDMX,然后添加ADO.NET DB上下文和实体生成器模板。
2)为通用数据接口创建一个新的库项目:一个存储库接口,在(1)中实现,实体t4模板及其输出,从(1)移动到这个项目中(更改TT inputFile 参数,使其引用其他项目中的EDMX。)
3)创建一个新的 MVC应用程序,它使用Ninject实例化(2)中声明的通用存储库,并在(1)中实现基于SDF的存储库。
Web应用程序运行正常,我可以查看和编辑数据。现在我应该通过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数据服务,更改生成代码的一些行,以及所有神奇的工作:)。所以我认为这与我的分层架构有关,特别是对于缺少的上下文警告。任何人都可以帮助在这样的分层场景中使用此服务吗?谢谢!
...值不能为空。参数名称:key 在System.Collections.Generic.Dictionary
2.FindEntry(TKey key) at System.Collections.Generic.Dictionary
2.get_Item(TKey key)at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary2 knownTypes, IDictionary
2个childTypes,IDictionary2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService
1.CreateProvider()at System.Data.Services.DataService1.HandleRequest() at System.Data.Services.DataService
1.ProcessRequestForMessage(流 messageBody)在SyncInvokeProcessRequestForMessage(Object,Object [], 对象[])在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,对象[]输入,对象[]&amp;输出) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) System.ArgumentNullException:值不能为null。 参数名称:键位于 System.Collections.Generic.Dictionary2.FindEntry(TKey key) at System.Collections.Generic.Dictionary
2.get_Item(TKey key)at System.Data.Services.Providers.ObjectContextServiceProvider.PopulateMetadata(IDictionary2 knownTypes, IDictionary
2个childTypes,IDictionary2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService
1.CreateProvider()at System.Data.Services.DataService1.HandleRequest() at System.Data.Services.DataService
1.ProcessRequestForMessage(流 messageBody)在SyncInvokeProcessRequestForMessage(Object, Object [],Object [])at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,对象[]输入,对象[]&amp;输出) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)...
答案 0 :(得分:0)
这可能不是最好的解决方案,但这里是我如何设法与EF和WCF分层:
创建MVC应用程序项目。
创建一个新的Web应用程序项目,将您的实体模型和WCF服务添加到此项目中。编辑post build事件,将相关的dll从你的bin / / .svc文件复制到你的MVC项目。
创建您的图书馆项目,添加您的服务参考。从MVC应用程序中使用此库。确保在实例化上下文时使用MVC .svc文件的路径。