Đây là vấn đề tôi đã điều tra trong tuần trước và không thể tìm thấy giải pháp nào. Tìm thấy các bài đăng hỏi giống nhau nhưng không bao giờ nhận được câu trả lời, hy vọng điều này cũng sẽ giúp người khác.Làm thế nào để hủy bỏ một dòng từ dịch vụ WCF mà không đọc nó để kết thúc?
Tôi có dịch vụ WCF
trả về đối tượng chứa stream
bên trong nó. Tôi sử dụng basicHttpBinding
với truyền trực tiếp và Mtom để gửi cho khách hàng.
Khách hàng gọi dịch vụ WCF
và đóng proxy ngay sau khi nhận được các đối tượng phản ứng.
Tiếp theo, khách hàng sẽ đọc dòng nó nhận được từ các dịch vụ WCF và ghi nó vào một tập tin trên đĩa địa phương. Tất cả điều này hoạt động tốt.
Vấn đề của tôi là khi khách hàng muốn hủy bỏ các hoạt động và dừng tải dữ liệu từ các dịch vụ WCF. Nếu tôi gọi .close()
trên luồng, ví dụ: serverReply.DataStream.Close();
thì nó sẽ chặn và đọc toàn bộ luồng từ dịch vụ WCF cho đến khi kết thúc trước khi tiếp tục. Luồng có thể khá lớn và mạng không phải lúc nào cũng nhanh.
này là rất không mong muốn cho cả hai sử dụng tài nguyên mạng, mà về cơ bản bị lãng phí trên dữ liệu đó không có người sử dụng nữa. Và vì basicHttpBinding
chỉ cho phép hai kết nối TCP đồng thời (theo mặc định) cho máy chủ dịch vụ WCF, nó chặn các nỗ lực kết nối khác cho đến khi luồng được đọc cho đến khi kết thúc.
Tôi có thể tăng số lượng kết nối đồng thời, nhưng đó sẽ là một giải pháp tồi vì nó sẽ tạo ra lỗ mở cho sự cố.
Ví dụ, 20 tải aborted rằng vẫn đang tải dữ liệu đến vứt nó đi. Tôi cần phải thực hiện việc chuyển nhượng hoàn toàn.
Trên máy khách, đối tượng luồng chỉ là lớp Stream
thông thường, vì vậy nó chỉ có phương pháp đóng, không có gì khác.
Gọi .close()
hoặc .abort()
trên đối tượng proxy không giúp đỡ, không phá hủy nó bằng cách sử dụng .dispose()
hoặc bất kỳ phương pháp nào khác. Ở phía máy chủ, tôi xử lý sự kiện OperationContext.OperationCompleted
nhưng không được kích hoạt cho đến khi dữ liệu từ stream
được đọc cho đến khi kết thúc.
Vì vậy, câu hỏi là, làm cách nào để đóng/hủy luồng mà không đọc hoàn toàn?
Bất kỳ may mắn nào với điều này? – Schultz9999
Đau khổ cùng một vấn đề trong khi gửi các tập tin thực sự lớn ... có vẻ như phải thiếu một cái gì đó thực sự rõ ràng. có lẽ sẽ phải thực hiện chunking như một workaround. –