2010-05-11 79 views
7

Số lần thử đầu tiên của tôi khi tạo dịch vụ tự lưu trữ. Cố gắng để làm một cái gì đó lên mà sẽ chấp nhận một chuỗi truy vấn và trả về một số văn bản nhưng có có một vài vấn đề:Dịch vụ lưu trữ tự WCF - Điểm cuối trong C#

  • Tất cả các cuộc đàm phán tài liệu về thiết bị đầu cuối được tạo ra tự động cho mỗi địa chỉ cơ sở nếu chúng không được tìm thấy trong một cấu hình tập tin. Điều này dường như không đúng với tôi, tôi nhận được ngoại lệ "Dịch vụ không có điểm cuối ứng dụng ...". Chỉ định một endpoint cơ sở như sau dường như để giải quyết này:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.ServiceModel; 
    using System.ServiceModel.Description; 
    
    namespace TestService 
    { 
        [ServiceContract] 
        public interface IHelloWorldService 
        { 
         [OperationContract] 
         string SayHello(string name); 
        } 
    
        public class HelloWorldService : IHelloWorldService 
        { 
         public string SayHello(string name) 
         { 
          return string.Format("Hello, {0}", name); 
         } 
        } 
    
        class Program 
        { 
         static void Main(string[] args) 
         { 
          string baseaddr = "http://localhost:8080/HelloWorldService/"; 
          Uri baseAddress = new Uri(baseaddr); 
    
          // Create the ServiceHost. 
          using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
          { 
           // Enable metadata publishing. 
           ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
           smb.HttpGetEnabled = true; 
           smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
           host.Description.Behaviors.Add(smb); 
    
           host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr); 
           host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello"); 
    
           //for some reason a default endpoint does not get created here 
           host.Open(); 
    
           Console.WriteLine("The service is ready at {0}", baseAddress); 
           Console.WriteLine("Press <Enter> to stop the service."); 
           Console.ReadLine(); 
    
           // Close the ServiceHost. 
           host.Close(); 
          } 
         } 
        } 
    } 
    
  • Làm thế nào tôi sẽ đi về thiết lập này để trả lại giá trị của tên trong SayHello (string name) khi được yêu cầu thusly: localhost: 8080/HelloWorldService/? tên SayHello = kyle

tôi đang cố gắng để đi trước khi chạy, nhưng điều này chỉ có vẻ như bò ...

+0

Bạn đang sử dụng .NET 3.5 hoặc .NET 4 ?? Tính năng "tạo điểm cuối mặc định cho địa chỉ cơ sở" là một tính năng mới trong .NET 4 - sẽ không hoạt động ở 3,5 –

Trả lời

10

Đối với câu hỏi của bạn về điểm cuối mặc định không được bổ sung:

  • trước hết, đó là một tính năng WCF 4 - nó sẽ làm việc trên NET 4 chỉ
  • tiếp theo, mặc định điểm cuối chỉ được thêm vào máy chủ dịch vụ của bạn nếu bạn không có điểm cuối rõ ràng được xác định trong cấu hình và nếu bạn không tự thêm điểm cuối vào mã! Bằng cách thêm hai điểm cuối đó vào mã, bạn sẽ chịu trách nhiệm và thời gian chạy WCF 4 sẽ không fiddle với cấu hình của bạn

Kiểm tra bài viết thư viện MSDN này để biết thêm thông tin về What's new in WCF 4 for developers. Nó cho thấy, trong số những thứ khác, làm thế nào để sử dụng điểm cuối mặc định - bạn về cơ bản xác định một địa chỉ cơ sở cho dịch vụ của bạn và mở ServiceHost - đó là tất cả!

string baseaddr = "http://localhost:8080/HelloWorldService/"; 
Uri baseAddress = new Uri(baseaddr); 

// Create the ServiceHost. 
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
{ 
    //for some reason a default endpoint does not get created here 
    host.Open(); 

    // here, you should now have one endpoint for each contract and binding 
} 

Bạn cũng có thể thêm các điểm cuối mặc định một cách rõ ràng, bằng mã, nếu bạn muốn làm như vậy. Vì vậy, nếu bạn cần thêm thiết bị đầu cuối của mình, nhưng sau đó bạn muốn thêm các điểm cuối mặc định hệ thống, bạn có thể sử dụng:

// define and add your own endpoints here 

// Create the ServiceHost. 
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
{ 
    // add all the system default endpoints to your host 
    host.AddDefaultEndpoints(); 

    //for some reason a default endpoint does not get created here 
    host.Open(); 

    // here, you should now have your own endpoints, plus 
    // one endpoint for each contract and binding 
} 

Tôi cũng fonud this blog post here là khá sáng - Blog Christopher đầy tốt và rất hữu ích WCF bài đăng - rất được đề xuất.

+0

Cảm ơn marc, tôi chắc chắn sẽ kiểm tra những cuốn sách đó. Tôi đang ở vị trí không may là không thể sử dụng .NET4, nhưng cũng nhờ liên kết tới blog của chris, có vẻ như tôi có một số đọc tốt trước tôi. Tôi đang xem xét sử dụng WebServiceHost thay vì tất cả những gì tôi thực sự cần làm là thực hiện một hành động được yêu cầu thông qua yêu cầu HTTP GET và trả về một số dữ liệu nhỏ. – Kyle

0

Nếu IIS tổ chức dịch vụ web của bạn, sau đó bạn sẽ có được thân thiện "bạn đã tạo một trang dịch vụ web "", giả sử không có gì khác là sai. Bạn có thể muốn thử một số hướng dẫn WCF nhanh chóng, như có thể được tìm thấy trong cuốn sách Learning WCF của Bustamente, chúng đi nhanh và giải thích rất nhiều.

EDIT: Here's an MSDN page hiển thị một cách để nhận các tham số chuỗi truy vấn khỏi cuộc gọi dịch vụ được yêu cầu của bạn, ví dụ hay. Nó cho thấy việc sử dụng thuộc tính [WebGet]. Nếu bạn không muốn sử dụng điều đó, bạn có thể thử sử dụng OperationContext để truy cập vào nội bộ của yêu cầu đến.

+0

Cảm ơn, tôi đã tìm kiếm sách phong nha, tôi sẽ kiểm tra. – Kyle

3

Đối với sách - đây là khuyến nghị của tôi: sách tôi luôn khuyên bạn nên đứng dậy và chạy trong WCF nhanh chóng là Learning WCF bởi Michele Leroux Bustamante. Cô ấy bao gồm tất cả các chủ đề cần thiết, và theo một cách rất dễ hiểu và dễ tiếp cận. Điều này sẽ dạy cho bạn tất cả mọi thứ - vấn đề cơ bản, chủ đề trung gian, bảo mật, kiểm soát giao dịch và vv - bạn cần phải biết để viết các dịch vụ WCF chất lượng cao, hữu ích.

Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Các chủ đề nâng cao hơn và sâu hơn nhìn vào WCF sẽ được bao phủ bởi Programming WCF Services bởi Juval Lowy. Ông thực sự đi sâu vào tất cả các chi tiết kỹ thuật và các chủ đề và trình bày "kinh thánh" cho lập trình WCF.

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg