Tôi có cả hai đầu của một kết nối hai hướng Stream
, mà tôi muốn thực hiện một số giao tiếp. Việc triển khai bên dưới luồng không quan trọng, tôi muốn làm việc ở cấp độ Stream
...Sử dụng WCF để quấn một luồng kết nối hiện có
Thay vì triển khai giao thức truyền thông của riêng mình cho luồng, tôi muốn sử dụng tất cả các tính sẵn sàng WCF hiện có để bao bọc luồng hiện tại với kênh liên lạc WCF hai chiều (yêu cầu/phản hồi + gọi lại).
Câu hỏi của tôi là, làm cách nào tôi có thể thực hiện việc này ...?
UPDATE:
Tôi đã đi xuống con đường thực hiện một phương tiện giao thông tùy chỉnh. Tôi đã có làm việc này, nhưng tôi vẫn không hoàn toàn hài lòng với nó ...
Tôi đã thực hiện một IDuplexSessionChannel
để bọc các dòng, cùng với phù hợp IChannelFactory
và IChannelListener
, và một Binding Yếu tố để tạo kênh nhà máy. Bây giờ, tôi chỉ cần đi qua các dòng kết nối, và cuối cùng vượt qua chúng vào kênh vận chuyển khi nó được tạo ra.
Vì vậy, tôi có thể tạo ra các proxy client để truy cập vào các dịch vụ thông qua các dòng như sau:
var callback = new MyCallback();
var instanceContext = new InstanceContext(callback);
var pipeFactory = new DuplexChannelFactory<IMyService>(instanceContext, new StreamBinding(clientStream),
new EndpointAddress("stream://localhost/MyService"));
var serviceProxy = pipeFactory.CreateChannel();
Vấn đề tôi đã là, có vẻ như WCF được thiết lập về việc sử dụng một ServiceHost
để tạo ra các máy chủ kết thúc của kênh, qua một số IChannelListener
. Trong trường hợp của tôi, tôi đã có một luồng kết nối và tôi sẽ không thể nghe thêm bất kỳ kết nối nào khác. Tôi có thể làm việc xung quanh điều này, nhưng tôi muốn không sử dụng một ServiceHost
để tạo ra kết thúc máy chủ của kênh, bởi vì tôi kết thúc với rất nhiều boilerplate tối nghĩa và hack để làm cho nó hoạt động.
Câu hỏi
Tôi đang tìm, do đó, cho một cách tốt hơn để có những IDuplexSessionChannels, và quấn chúng thành một proxy kênh ở cả máy chủ và máy khách kết thúc.
Hoặc có thể triển khai ServiceHost khác không yêu cầu IChannelListener
.
Thực sự, vấn đề ở đây là tôi không muốn có một máy chủ, sắp xếp nhiều máy khách, tôi có mối quan hệ 1-1 giữa Dịch vụ WCF và máy khách của mình. Có một cách chính xác để nhanh chóng một trong những?
Để đặt nó theo một cách khác, tôi muốn tạo cá thể dịch vụ phía máy chủ mà không cần sử dụng ServiceHost.
Mọi đề xuất sẽ được đánh giá cao ở giai đoạn này.
Dường như bạn có thể nhầm lẫn vai trò của một máy chủ dịch vụ WCF và một phiên bản dịch vụ WCF. Một máy chủ dịch vụ WCF cung cấp các cá thể của một dịch vụ dựa trên InstanceContextMode. [Bài đăng trên blog] này (http://www.danrigsby.com/blog/index.php/2008/05/23/understanding-instancecontext-in-wcf/) có giải thích tốt về cách hoạt động của nó.Bạn thực sự không thể có một thể hiện của một dịch vụ WCF mà không có một ServiceHost cung cấp nó. ServiceHost lần lượt có một sự phụ thuộc vào một ChannelListener để quản lý cơ sở hạ tầng tin nhắn cho nó. Nếu không có nó, bạn sẽ có một ServiceHost "điếc" :) –
Vì vậy, những gì tôi đang cố gắng làm là làm những thứ 'ServiceHost' để tạo ra một cá thể' InstanceContext' và Service. 'ServiceHost' phải làm điều này khi nó chấp nhận một kết nối mới đến. Tôi đã có kết nối được thiết lập, vì vậy tôi muốn bỏ qua phần nghe. Chắc chắn đây không phải là * không thể * ...? – Mark
@Mark Với tôi điều này giống như việc lấy một đường hầm hiện có và xây dựng một đường hầm khác để chứa nó ... WCF không được xây dựng cho loại công cụ này ... chính xác là vấn đề gì với luồng hiện tại (mà bạn viết đang hoạt động) mà cho phép bạn nghĩ rằng việc sử dụng WCF sẽ giải quyết? – Yahia