我是OData和WCF数据服务的新手,所以这可能是一个容易的问题。我正在使用VS Web Developer Express 2010,在那里我有一个非常简单的WCF数据服务托管在控制台应用程序中。它从存储库返回一个简单的"学习"类的可查询集合(位于一个分离的dll项目中),这反过来又从另一个dll中的db项目检索"学习"类(所以在解决方案中的3个项目)。
我在数据库项目中也有一个"实验"类,可以在一个研究中有多个实验。当我从研究中排除实验课时,一切都有效,我得到了数据。当我将List集合添加到Study类时,就会出现这个问题,然后在尝试运行服务时得到一个运行时错误。在Firebug中,错误是"500内部服务器错误",而浏览器中的消息是"请求错误"。服务器在处理请求时遇到错误。
我有IIS 7,我也刚刚安装了IIS 7.5,但它对我来说又是全新的,所以我不知道服务托管在哪里,也不知道在哪里查看服务器/web日志。只有IIS 7日志可见在"C:inetpublogsLogFilesW3SVC1"。当我运行应用程序时,VS web服务器(Cassini)没有启动,所以这表明它被托管在IIS 7.5(?)中。
-我如何返回子类/复杂对象?
-我如何知道我的服务托管在哪里,我在哪里可以找到服务器日志?
这是主机应用程序:
using MyStudyRepository;
using MyStudyDB;
namespace MyStudyService
{
public class Program
{
public static void Main(string[] args)
{
string serviceAddress = "http://localhost:998";
Uri[] uriArray = { new Uri(serviceAddress) };
Type serviceType = typeof(StudyDataService);
using (var host = new DataServiceHost(serviceType,uriArray))
{
host.Open();
Console.WriteLine("Press any key to stop service");
Console.ReadKey();
}
}
}
public class StudyDataService : DataService<StudyRepository>
{
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
}
}
}
仓库如下:
using MyStudyDB;
namespace MyStudyRepository
{
public class StudyRepository
{
List<Study> _List = new List<Study>();
//Add constructor to populate myStudies list on creation of class
public StudyRepository()
{
for (int i = 1; i < 5; i++)
{
Study myStudy = new Study() { ID = i, StudyOwnerId = i, StudyName = "Study" + i.ToString() /*, Experiments = null */ };
_List.Add(myStudy);
}
}
public IQueryable<Study> Studies
{
get
{
return _List.AsQueryable<Study>();
}
}
}
}
DB:
namespace MyStudyDB
{
public class Study
{
public int ID { get; set;}
public int StudyOwnerId { get; set; }
public string StudyName { get; set; }
//public List<Experiment> Experiments { get; set; }
}
public class Experiment
{
public int ID { get; set; }
public string Name { get; set; }
public int StudyId { get; set; }
}
}
要调试WCF数据服务,请参考这篇博客文章:http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx至于为什么实验集合不起作用,有两个原因:
- 实验类不被识别为实体类型,因为没有为它设置实体。(实体集是您的存储库类上的IQueryable属性,您没有)。因此,实验类只被识别为复杂类型。
- 当前发布的WCF Data Services版本不支持MultiValues, MultiValue实际上是一个基本或复杂类型的集合。
所以你有两种方法来"修复"这个问题。通过在您的存储库类上添加IQueryable属性,确保Experiment实际上是一个实体。或者使用最新的CTP (http://blogs.msdn.com/b/astoriateam/archive/2011/06/30/announcing-wcf-data-services-june-2011-ctp-for-net4-amp-sl4.aspx),它支持MultiValues。
谢谢!我猜它缺少DataServiceKey
属性的类,如下所示:
[DataServiceKey("ID")]
public class Study
{
.....
}