2010-10-18 34 views
12

Tôi sẽ bắt đầu bằng cách nói rằng tôi không phải là nhà phát triển .NET, nhưng đã bị ném vào một dự án mà tôi cần sử dụng MSMQ để ứng dụng web ASP cổ điển có thể gửi tin nhắn tới Dịch vụ Windows C xử lý việc xử lý. Tôi có kinh nghiệm tích hợp hàng đợi tin nhắn khác với các ngôn ngữ khác, nhưng như tôi đã đề cập, tôi không có nhiều kinh nghiệm với phát triển .NET và Windows nên một số hướng dẫn sẽ được đánh giá cao.Cách tạo Dịch vụ nghe C# cho MSMQ dưới dạng dịch vụ Windows

Dưới đây là câu hỏi của tôi ...

  1. một người nào đó có thể cung cấp một số mã # C cơ bản mà lắng nghe một hàng đợi MSMQ hiện và phản ứng với thông điệp mới bằng cách làm một cái gì đó đơn giản như viết dấu thời gian hiện tại để đăng nhập tệp hoặc gửi email?

  2. Làm cách nào để đóng gói mã này trong Visual Studio .NET để tạo và cài đặt Dịch vụ Windows? (Tôi nên sử dụng loại dự án Visual C# 2010 nào.) Tôi đang sử dụng Visual C# 2010 Express.)

  3. Cuối cùng, tôi không chắc chắn phiên bản và/hoặc triển khai MSMQ nào tôi cần phải sử dụng cho các yêu cầu của mình ASP cổ điển. Tôi nghĩ rằng phiên bản COM là những gì tôi cần, nhưng tôi cũng đã đọc về một phiên bản WCF mới, cũng như sự khác biệt giữa 3.0 và 4.0. Có thể ai đó xin vui lòng cho tôi hướng mà tôi nên sử dụng phiên bản nào?

Rất cám ơn!

Trả lời

3

Theo như tôi biết, Visual Studio Express không có mẫu dự án cho dịch vụ. Điều đó không có nghĩa là bạn không thể viết một dịch vụ Windows với VSE, chỉ là bạn sẽ không có một mẫu để giúp bạn bắt đầu.

Để tạo một dịch vụ bạn chỉ có thể tạo một ứng dụng Console thông thường. Tạo lớp dịch vụ sẽ chịu trách nhiệm thực hiện dịch vụ thực tế. Nó sẽ giống như thế này

using System.ServiceProcess; 

namespace WindowsService1 
{ 
    public partial class Service1 : ServiceBase 
    { 
    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
    } 

    protected override void OnStop() 
    { 
    } 
    } 
} 

Sau đó, các mã khởi động dịch vụ có thể đi vào Main chức năng của dịch vụ.

using System.ServiceProcess; 

namespace WindowsService1 
{ 
    static class Program 
    { 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
      { 
       new Service1() 
      }; 
     ServiceBase.Run(ServicesToRun); 
    } 
    } 
} 

Điều đó sẽ cung cấp cho bạn khung cơ bản cho dịch vụ của bạn. Một thứ khác bạn cần là thêm một trình cài đặt cho dịch vụ để nó có thể được cài đặt như một dịch vụ. Sau đây sẽ giúp bạn bắt đầu, lưu ý tôi đã lưu ý kiểm tra này.

using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace WindowsService1 
{ 
    [RunInstaller(true)] 
    public class ProjectInstaller : Installer 
    { 
    private ServiceProcessInstaller serviceProcessInstaller1; 
    private ServiceInstaller serviceInstaller1; 

    public ProjectInstaller() 
    { 
     this.serviceProcessInstaller1 = new ServiceProcessInstaller(); 
     this.serviceInstaller1 = new ServiceInstaller(); 

     this.serviceProcessInstaller1.Password = null; 
     this.serviceProcessInstaller1.Username = null; 

     this.serviceInstaller1.ServiceName = "Service1"; 

     this.Installers.AddRange(new System.Configuration.Install.Installer[] { 
     this.serviceProcessInstaller1, 
     this.serviceInstaller1}); 
    } 
    } 
} 

Với những điều trên, bạn nên có đủ để tìm kiếm xung quanh hoặc hỏi thêm chi tiết về tạo dịch vụ. Đối với người nghe MSMQ, bạn có thể sử dụng bài viết MSDN sau đây như là một điểm khởi đầu

http://msdn.microsoft.com/en-us/library/ms978425.aspx

+0

mã mẫu tuyệt vời để giúp tôi bắt đầu sử dụng Dịch vụ Windows, cảm ơn. – philfeyn

+0

có cách nào khác để cài đặt dịch vụ không, ngay cả khi cài đặt thủ công? Phải mã hóa cứng tên người dùng và mật khẩu để chạy dịch vụ như trong mã có vẻ thực tế không tốt đối với tôi. – philfeyn

+0

@philfeyn, bạn có thể đặt ServiceProcessInstaller.Account để chọn loại tài khoản. Nếu nó được đặt thành ServiceAccount.User và tên người dùng/mật khẩu được đặt thành null, bạn sẽ được nhắc nhập thông tin đăng nhập khi bạn cài đặt dịch vụ. Bạn có thể cài đặt thủ công dịch vụ bằng InstallUtil.exe đi kèm với .NET framework. –

8

Bạn có thể chờ đợi một tin nhắn trên một hàng đợi được sử dụng đoạn mã sau (Bạn muốn sử dụng hàng đợi tin tên SomeQueue trên máy tính của bạn, tên ComputerName => QueueName = @ "ComputerName \ private $ \ SomeQueue")

public void AsyncWatchQueue(object encapsulatedQueueName) 
    { 
     Message newMessage; 
     MessageQueue queue; 

     string queueName = encapsulatedQueueName as string; 
     if (queueName == null) 
      return; 

     try 
     { 
      if (!MessageQueue.Exists(queueName)) 
       MessageQueue.Create(queueName); 
      else 
      { 
       queue = new MessageQueue(queueName); 

       if (queue.CanRead) 
        newMessage = queue.Receive(); 
      } 
      HandleNewMessage(newMessage); // Do something with the message 
     } 
     // This exception is raised when the Abort method 
     // (in the thread's instance) is called 
     catch (ThreadAbortException e) 
     { 
      //Do thread shutdown 
     } 
     finally 
     { 
      queue.Dispose(); 
     } 
    } 

Lưu ý: phương pháp Receove sẽ chặn cho đến khi một thông điệp được nhận lúc này nó sẽ loại bỏ thông điệp từ hàng đợi và trả lại.

chỉnh sửa: thêm mã cho việc thực hiện phần đa luồng (và đổi tên thành phương pháp chữ ký trên)

Chủ đề Tạo Mã số:

 public Thread AddWatchingThread(string QueueName) 
    { 
     Thread Watcher = 
      new Thread(new ParameterizedThreadStart(AsyncWatchQueue)); 
     Watcher.Start(QueueName); 
     // The thread instance is used to manipulate (or shutdown the thread) 
     return Watcher; 
    } 

tôi sẽ chỉ cần lưu ý, rằng đây là chưa được kiểm tra cod, nó chỉ là một ví dụ nhanh chóng

+0

Bạn chắc chắn rằng cuộc gọi Exists() sẽ hoạt động? http://blog.plumbersmate.eu/archive/2010/10/18/checking-if-msmq-queues-exist-is-hard-work-so-should.aspx –

+0

@Neowizard, Sử dụng mã ví dụ về Dịch vụ Windows ở trên , mã của bạn thuộc về phương thức OnStart() của WindowsService1 đúng không? Khi một tin nhắn được nhận bởi x.Receive(), nó được trả về ở đâu? Bạn có thể cung cấp một số mã cho một ví dụ về nhận xét cuối cùng của bạn về việc tạo một chuỗi mới chờ tin nhắn không? Ví dụ, khi nhận được một tin nhắn mới? Cảm ơn! – philfeyn

+0

Đoạn mã trên chỉ là một mã cơ bản để thiết lập một chuỗi để chờ tin nhắn đến trong hàng đợi. Nó không đưa vào các vấn đề có hiệu lực do các dịch vụ hoặc bất cứ điều gì khác sau đó là MSMQ. Tôi sẽ thêm một số mã vào câu trả lời để cải thiện nó, nhưng nó sẽ là một ý tưởng tốt hơn cho bạn để làm một số sandbox chơi với lớp MessageQueue \ object – Neowizard

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