2011-08-10 97 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 
{ 
    ..... 
}