2010-06-15 22 views
11

Tôi có một dự án cần triển khai dịch vụ dữ liệu WCF (OData) để lấy dữ liệu từ hệ thống điều khiển (Ứng dụng .NET Framework). Dịch vụ dữ liệu WCF cần được lưu trữ bởi ứng dụng .NET (Không có ASP.NET và NO IIS).Làm thế nào để thực hiện các lưu trữ dữ liệu WCF Tự lưu trữ (http: // localhost: 1234/myDataService.svc/...)

Tôi đã xem nhiều ví dụ về Dịch vụ dữ liệu WCF gần đây; tất cả chúng đều được ứng dụng ASP.NET lưu trữ. Tôi cũng thấy các ví dụ tự lưu trữ (giao diện điều khiển), nhưng nó là dành cho WCF Service (không phải WCF Data Service).

Có thể có một ứng dụng .NET độc lập để lưu trữ các dịch vụ dữ liệu WCF (http: //localhost:1234/mydataservice.svc/...).

Nếu có, ai đó có thể cung cấp ví dụ không?

+0

Bạn đã thử chưa? Bạn đã có thể tự chủ một dịch vụ WCF bình thường? –

+1

Tiền thưởng sẽ được chuyển đến marc_s sau khi hết thời hạn. (Đối với câu trả lời tuyệt vời của ông đã tiết kiệm cho tôi rất nhiều thời gian.) Không có câu trả lời mới là cần thiết cho tiền thưởng. – Vaccano

Trả lời

28

Tôi vừa thử điều tương tự - và có, bạn có thể lưu trữ một Dịch vụ dữ liệu WCF trong hội đồng của riêng bạn - với một vài thủ thuật nhỏ.

Đây là cách:

  • đưa mô hình dữ liệu của bạn (EF Data Model) vào lắp ráp riêng của mình, chúng ta hãy gọi nó DataModel

  • tạo một dự án thư viện lớp mới (gọi nó là MyDataServiceHost)

  • thêm một vài tham chiếu:

    • lắp ráp DataModel của bạn với các lớp dữ liệu
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - bạn không thể chọn này từ Add Reference thoại thông thường theo thể loại NET - bạn cần phải để duyệt các tập tin lắp ráp. Tìm thư mục (hoặc C:\Program Files (x86)\... trên một máy 64-bit) và chọn System.Data.Services.dll bên trong nó
  • thêm một lớp mới để mà thư viện lớp và gọi nó là ví dụ YourDataService.cs - nó sẽ giống như thế này:

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

    Bạn có thể đặt tên cho bất cứ điều gì lớp học mà bạn thích, và nó phải xuất phát từ DataService<T> nơi T là tên của mô hình dữ liệu của bạn; nếu bạn đang sử dụng Entity Framework, đó là tên của lớp ngữ cảnh đối tượng của bạn - thường là một cái gì đó giống như (database)Entities hoặc bất kỳ thứ gì bạn đã chọn khi bạn tạo ra EDM

  • thêm một lớp khác vào dự án mới của bạn, gọi nó là MyDataServiceHost.cs và nó sẽ trông một cái gì đó như thế này:

    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(); 
          } 
         } 
        } 
    } 
    

    nó khởi tạo một DataServiceHost, mà có nguồn gốc từ WebServiceHost (do đó có nguồn gốc từ ServiceHost) và nó sẽ quay lên thời gian chạy Data Service WCF cho bạn.

  • bây giờ bạn có thể khởi động dịch vụ dữ liệu WCF của bạn từ bất kỳ ứng dụng sử dụng:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService"); 
    
  • Điều cuối cùng cần nhớ: ứng dụng mà bạn sử dụng để khởi động Data Service WCF phải có chuỗi kết nối (chuỗi kết nối EDM, nếu bạn đang sử dụng Entity Framework) trong app.config (hoặc web.config) của nó để làm việc này!

+0

Nếu bạn đang xem câu hỏi này nữa, tôi đã theo dõi câu trả lời của bạn và nhận dịch vụ đang chạy, nhưng khi tôi cố gắng xem nó trong firefox như thế này: http: // localhost: 4444/EntitySearch/Countries Tôi nhận được kết quả này: 'Tài nguyên không tìm thấy cho phân khúc 'Quốc gia'.' Tôi đã kiểm tra lại mã EF của tôi và lớp đó có ở đó (' Public ObjectSet Countries ') Bất kỳ ý tưởng nào? – Vaccano

+0

Tôi đã viết sai chính tả tên phương thức 'InitializeService'. (Grr, nên chỉ cần sao chép và dán.) – Vaccano

+0

Tôi sẽ khuyên bạn nên cài đặt gói WCF Data Services Server NuGet thay vì điều hướng đến một hội đồng địa phương để tham chiếu đến System.Data.Services. – Kilhoffer

Các vấn đề liên quan