11

コントロール システム (.NET Framework アプリケーション) からデータを取得するために WCF データ サービス (OData) を実装する必要があるプロジェクトがあります。WCF データ サービスは、.NET アプリケーションによってホストされる必要があります (ASP.NET も IIS もありません)。

最近、多くの WCF Data Service の例を見てきました。それらはすべて ASP.NET アプリケーションによってホストされます。セルフホスト (コンソール アプリケーション) の例も表示されますが、これは WCF サービス (WCF データ サービスではありません) 用です。

WCF Data Services (http: //localhost:1234/mydataservice.svc/...) をホストするスタンドアロンの .NET アプリケーションを持つことができます。

はいの場合、誰かが例を提供できますか?

4

1 に答える 1

28

私はちょうど同じことを試しました - はい、いくつかの小さなトリックで、独自のアセンブリで WCF データ サービスをホストできます。

方法は次のとおりです。

  • データモデル(EFデータモデル)を独自のアセンブリに入れ、それを呼び出しましょうDataModel

  • 新しいクラス ライブラリ プロジェクトを作成します (それを と呼びますMyDataServiceHost)

  • いくつかの参照を追加します。

    • データレイヤーをDataModel使用したアセンブリ
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services- .NET カテゴリの下の通常のダイアログからこれを選択することはできませんAdd Reference- アセンブリ ファイルを参照する必要があります。ディレクトリC:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0(またはC:\Program Files (x86)\...64ビットマシン上)を見つけて、そのSystem.Data.Services.dll中を選択します
  • そのクラス ライブラリに新しいクラスを追加し、それを呼び出します。たとえば、YourDataService.cs次のようになります。

    using System.Data.Services;
    using System.Data.Services.Common;
    
    using DataModel;
    
    namespace MyDataServiceHost
    {
        public class YourDataService : DataService<YourModelEntities>
        {
            // This method is called only once to initialize service-wide policies.
            public static void InitializeService(DataServiceConfiguration config)
            {
                // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
                // Examples:
                config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
                config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
            }
        }
    }
    

    クラスには好きな名前を付けることができ、データ モデルの名前はDataService<T>どこから派生する必要があります。TEntity Framework を使用している場合は、オブジェクト コンテキスト クラスの名前です。通常は(database)Entities、EDM を作成したときに選択したようなものです。

  • 新しいプロジェクトに別のクラスを追加して呼び出すとMyDataServiceHost.cs、次のようになります。

    using System;
    using System.Data.Services;
    
    using DataModel;
    
    namespace MyDataServiceHost
    {
        public class MyDataServiceHost
        {
            public static void LaunchDataService(string baseAddress)
            {
                Uri[] baseAddresses = new Uri[1];
                baseAddresses[0] = new Uri(baseAddress);
    
                using(DataServiceHost host = new DataServiceHost(typeof(YourDataService), baseAddresses))
                {
                    host.Open();
                    Console.WriteLine("DataService up and running.....");
    
                    Console.ReadLine();
                    host.Close();
                }
            }
        }
    }
    

    WebServiceHost から派生した (さらに ServiceHost から派生した) DataServiceHost をインスタンス化し、WCF Data Service ランタイムをスピンアップします。

  • 以下を使用して、任意のアプリから WCF Data Service を起動できるようになりました。

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
  • 最後に覚えておいていただきたいのは、WCF Data Service を起動するために使用するアプリは、そのために app.config (または web.config) に接続文字列 (Entity Framework を使用している場合は EDM 接続文字列) が含まれている必要があるということです。仕事に!

于 2010-06-15T05:09:34.830 に答える