2013-05-08 22 views
14

Tôi có dịch vụ windows và GUI cần giao tiếp với nhau. Hoặc có thể gửi tin nhắn bất cứ lúc nào.Giao tiếp hai chiều không đồng bộ với Windows Named Pipes (.Net)

Tôi đang xem sử dụng NamedPipes, nhưng có vẻ như bạn không thể đọc & ghi vào luồng cùng một lúc (hoặc ít nhất tôi không thể tìm thấy bất kỳ ví dụ nào bao gồm trường hợp này).

Có thể thực hiện loại giao tiếp hai chiều này thông qua một đơn NamedPipe không? Hoặc tôi có cần mở hai ống (một từ GUI-> dịch vụ và một từ dịch vụ-> GUI) không?

+2

Bạn có thể sử dụng WCF Duplex NamedPipes, tôi sử dụng phương pháp này cho dịch vụ của tôi/thông tin liên lạc App, Có một ví dụ tốt đẹp ở đây có thể help.http: //tech.pro/tutorial/855/wcf-tutorial- thông tin liên lạc cơ bản-liên lạc –

Trả lời

25

Sử dụng WCF bạn có thể sử dụng song tên Ống

// Create a contract that can be used as a callback 
public interface IMyCallbackService 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyClient(); 
} 

// Define your service contract and specify the callback contract 
[ServiceContract(CallbackContract = typeof(IMyCallbackService))] 
public interface ISimpleService 
{ 
    [OperationContract] 
    string ProcessData(); 
} 

Thực hiện Dịch vụ

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class SimpleService : ISimpleService 
{ 
    public string ProcessData() 
    { 
     // Get a handle to the call back channel 
     var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>(); 

     callback.NotifyClient(); 
     return DateTime.Now.ToString(); 
    } 
} 

chủ Dịch vụ

class Server 
{ 
    static void Main(string[] args) 
    { 
     // Create a service host with an named pipe endpoint 
     using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost"))) 
     { 
      host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService"); 
      host.Open(); 

      Console.WriteLine("Simple Service Running..."); 
      Console.ReadLine(); 

      host.Close(); 
     } 
    } 
} 

Tạo ứng dụng khách hàng, trong ví dụ này lớp khách hàng thực hiện hợp đồng gọi lại.

class Client : IMyCallbackService 
{ 
    static void Main(string[] args) 
    { 
     new Client().Run(); 
    } 

    public void Run() 
    { 
     // Consume the service 
     var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService")); 
     var proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.ProcessData()); 
    } 

    public void NotifyClient() 
    { 
     Console.WriteLine("Notification from Server"); 
    } 
} 
+0

Cảm ơn phản hồi chi tiết. Tôi đã đi với phương pháp này, vì nó có vẻ đơn giản hơn bằng cách sử dụng 2 ống được đặt tên. –

+0

Tôi cũng thấy điều này khá chi tiết và hữu ích: http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx –

+0

Bất kỳ ý tưởng nào tôi có thể làm cho dịch vụ Windows hoạt động tốt nhưng không thể tìm dịch vụ khi cố gắng thêm tham chiếu dịch vụ tôi nhận được 'net.pipe: // localhost/service1'. Đã xảy ra lỗi khi đọc từ đường ống: Đường ống đã kết thúc. (109, 0x6d). –

1

Các lớp dòng ống được đặt tên của bạn (máy chủ hoặc ứng dụng khách) phải được xây dựng với một PipeDirection của InOut. Bạn cần một NamedPipeServerStream, có thể trong dịch vụ của bạn, có thể được chia sẻ bởi một số lượng tùy ý các đối tượng NamedPipeClientStream. Xây dựng tên miền NamedPipeServerStream với tên của đường ống và hướng, và NamedPipeClientStream với tên của đường ống, tên của máy chủ, và PipeDirection, và bạn nên tốt để đi.

2

Sử dụng một điểm duy nhất để tích lũy tin nhắn (một ống đơn trong trường hợp này) buộc bạn phải tự xử lý hướng của thông điệp (ngoài ra bạn phải sử dụng khóa toàn hệ thống cho đường ống).

Vì vậy, hãy sử dụng 2 ống có hướng ngược nhau.

(Tùy chọn khác sẽ sử dụng 2 hàng đợi MSMQ).

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