3

我是 OData 和 WCF 数据服务的新手,所以这可能是一个简单的问题。我正在使用 VS Web Developer Express 2010,我在控制台应用程序中托管了一个非常简单的 WCF 数据服务。它从存储库(位于单独的 dll 项目中)返回一个简单的“研究”类的 IQuerable 集合,该集合又从另一个 dll 中的数据库项目中检索“研究”类(因此解决方案中有 3 个项目)。

我在 db 项目中也有一个“实验”类,一个研究中可以有多个实验。当我从研究中排除实验类时,一切正常,我得到了数据。当我将 List 集合添加到 Study 类时会出现问题,然后在尝试运行服务时出现运行时错误。在 Firebug 中,错误是“500 Internal Server Error”,浏览器中的消息是“Request Error”。服务器在处理请求时遇到错误。有关更多详细信息,请参阅服务器日志。

我有 IIS 7,而且我也刚刚安装了 IIS 7.5,但它对我来说还是全新的,所以我不知道该服务的托管位置或查看服务器/Web 日志的位置。'C:\inetpub\logs\LogFiles\W3SVC1' 中只有 IIS 7 日志可见。运行应用程序时 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>();
            }
        }
    }
}

这是数据库:

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; }
    }
}
4

2 回答 2

5

要调试 WCF 数据服务,请参阅此博客文章:http: //blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx 至于为什么收集实验不起作用,有两个原因:

  • Experiment 类未被识别为实体类型,因为没有为它设置实体。(实体集是您的存储库类上的 IQueryable 属性,您没有)。结果,实验类仅被识别为复杂类型。
  • 当前发布的 WCF 数据服务版本不支持 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),它确实支持多值。

于 2011-08-11T09:33:01.310 回答
1

谢谢!我猜它缺少DataServiceKey类上的属性,如下所示:

[DataServiceKey("ID")]
public class Study
{ 
    .....
} 
于 2012-06-04T06:55:34.140 回答