3

私はODataとWCFデータサービスを初めて使用するので、これは簡単な問題かもしれません。VS Web Developer Express 2010を使用しており、コンソールアプリで非常に単純なWCFデータサービスをホストしています。リポジトリ(別のdllプロジェクトにある)から単純な「Study」クラスのIQuerableコレクションを返します。これにより、別のdllのdbプロジェクト(ソリューション内の3つのプロジェクト)から「Study」クラスが取得されます。

また、dbプロジェクトには「Experiment」クラスがあり、1つのスタディに複数の実験が存在する可能性があります。実験クラスを研究から除外すると、すべてが機能し、データが返されます。この問題は、StudyクラスにListコレクションを追加すると発生し、サービスを実行しようとするとランタイムエラーが発生します。Firebugでは、エラーは「500 Internal Server Error」であり、ブラウザのメッセージは「RequestError」です。サーバーでリクエストの処理中にエラーが発生しました。詳細については、サーバーログを参照してください。

IIS 7を使用していて、IIS 7.5もインストールしたばかりですが、これもまったく新しいので、サービスがホストされている場所やサーバー/Webログを表示する場所がわかりません。'C:\ inetpub \ logs \ LogFiles\W3SVC1'に表示されるIIS7ログのみがあります。アプリを実行してもVSWebサーバー(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; }
    }
}
4

2 に答える 2

5

WCFデータサービスをデバッグするには、次のブログ投稿を参照してください。http: //blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx 理由について実験のコレクションが機能しない、2つの理由があります:

  • エンティティが設定されていないため、Experimentクラスはエンティティタイプとして認識されません。(エンティティセットは、リポジトリクラスのIQueryableプロパティであり、これはありません)。その結果、Experimentクラスは複合型としてのみ認識されます。
  • 現在リリースされているバージョンのWCFDataServicesは、MultiValuesをサポートしていません。MultiValueは、事実上、プリミティブ型または複合型のコレクションです。

したがって、これを「修正」する方法は2つあります。リポジトリクラスに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をサポートします。

于 2011-08-11T09:33:01.310 に答える
1

ありがとう!そして、私はそれがDataServiceKey次のようにクラスの属性を欠いていると思います:

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