2011-08-10 28 views
3

我是OData和WCF数据服务的全新产品,因此这可能是一个简单的问题。我正在使用VS Web Developer Express 2010,我在控制台应用程序中托管了一个非常简单的WCF数据服务。它从存储库(位于独立的dll项目中)返回一个简单的'Study'类的IQuerable集合,然后从另一个dll中的db项目(因此解决方案中的3个项目)中检索'Study'类。OData/WCF数据服务不适用于复杂类型

我也有在项目db的“实验”类可以有多个实验研究进展。当我从Study中排除实验课程时,所有工作都会正常进行,并且我会收回数据。当我将一个List集合添加到Study类时发生问题,然后在尝试运行该服务时遇到运行时错误。在Firebug中,错误是'500内部服务器错误',并且浏览器中的消息是'请求错误。服务器在处理请求时遇到错误。查看服务器日志了解更多详情。'

我有IIS 7,我也刚安装IIS 7.5,但再次它的品牌新的给我,所以我无法揣摩出服务托管或者查看服务器/网络日志。在'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>(); 
      } 
     } 
    } 
} 

而这里的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; } 
    } 
} 

回答

5

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

  • 由于没有为其设置实体类型,因此Experiment类不被识别为实体类型。 (实体集是您的存储库类中的IQueryable属性,您不具备此属性)。因此,实验类只能被识别为复杂类型。
  • WCF数据服务的当前发布版本不支持多值,多值实际上是原始的或复杂类型的集合。

所以,你有两种方式来“解决”这一点。通过在存储库类中添加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。

+0

嗨@Vitek,对答复表示感谢。我添加了一个IQueryable 属性到我的资源库类与Study属性相同的方式,但我仍然遇到问题。还有什么我应该做的? –

+0

好吧我想通了,最终只需要一点调整..再次感谢:) –

+5

你错过了什么? – Seph

1

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

[DataServiceKey("ID")] 
public class Study 
{ 
    ..... 
}