2012-11-30 35 views
8

WCF Nhật ký theo dõi hiển thị nhiều lỗi "The server has hit a PollingDuplex throttle, MaxSessionsPerAddress, and cannot accept another session from this client. An http error was returned".Vấn đề MaxSessionsPerAddress khi sử dụng WCF PollingDuplex và Silverlight client

Không thể tìm thấy đủ chi tiết về MaxSessionsPerAddress cài đặt, chỉ tìm thấy this post mà nói rằng MaxSessionsPerAddress luôn là 10 và không thể thay đổi. Chỉ cần suy nghĩ có thể là vấn đề này liên quan đến một logic khoan dung lỗi tôi đã thực hiện cho khách hàng proxy mà cùng với một số kết quả timeout trong vấn đề như vậy: Trong trường hợp một kênh thất bại WCF khách hàng proxy đóng một kênh (Close() sau đó Aboort() trong try/catch) và sau đó cố gắng kết nối lại sau mỗi 5 giây, N thử lại. Có lẽ một khách hàng không thể kết nối ngay cả sau 10 lần thử lại những gì đã tạo 10 phiên trên một dịch vụ để tất cả các lần thử lại tiếp theo đều bị từ chối?

Thông tin tổng quát:

  • kết nối PollingDuplex
  • Không thể tạo lại vấn đề này vì nó đã được quan sát một lần trong một môi trường sống và sau đó tắt để không ảnh hưởng đến người dùng
  • IIS log HTTPERR có nhiều Connection_Abandoned, Các mục nhập Connection_Dropped cho một dịch vụ không thành công

WCF Khách hàng:

  • Silverlight4
  • ClientPollTimeout = 5min
  • InactivityTimeout = 24h, SendTimeout = 30 phút, CloseTimeout = 3min
  • ReceiveTimeout = 24h, OpenTimeout = 3min

WCF Server:

  • IIS Hos ted
  • InstanceContextMode = PerSession
  • ConcurrencyMode = Nhiều
  • maxConcurrentCalls, maxConcurrentSessions, maxConcurrentInstances được thiết lập đến 500
  • HttpBinding, httpTransport, PollingDuplexBindingElement, DuplexChannelFactory
  • sendTimeout = "00:30:00", receiveTimeout = "24:00:00", openTimeout = "00:10:00", closeTimeout = "00:10:00"
  • maxOutputDelay = "00:00:01", không hoạt độngTimeout = "24:00:00", serverPollTimeout = "00:02:00"
  • maxR eceivedMessageSize = "1073741824", maxBufferSize = "1073741824", MaxBufferPoolSize = "2147483647"

Bất kỳ trợ giúp nào được đánh giá cao!

+0

Có thể dịch vụ đang chạy quá chậm nên không trả lời được yêu cầu của khách hàng một cách kịp thời. Bạn có ba cài đặt có khả năng tiêu thụ quá nhiều bộ nhớ cho dịch vụ của bạn. Bạn có thực sự muốn dịch vụ xử lý thông báo yêu cầu có thể có kích thước tối đa * 1 GB * không? Ngoài ra, ** MaxBufferPoolSize ** được đặt thành kích thước không thực tế, * 2 GB *. Hãy thử xóa các thuộc tính ** maxBufferSize ** và ** maxBufferPoolSize ** từ tệp cấu hình (hoặc trong mã) và đặt ** maxReceivedMessageSize ** thành kích thước khả thi cho ứng dụng của bạn (có khả năng dưới 2 - 3 * MB *) cho cả khách hàng & dịch vụ. –

+0

Bạn có nghĩ rằng các giá trị này bằng cách nào đó ảnh hưởng đến hành vi dịch vụ hoặc tài nguyên được phân bổ trước khi khởi động không? Thực sự tôi cần vài KB nhưng tối đa hóa các giá trị đó để loại bỏ các vấn đề có thể liên quan đến kích thước bộ đệm thư kể từ bây giờ tôi không biết phải làm gì với các lỗi như vậy – sll

+1

Tôi đã thấy các vấn đề về hiệu năng gây ra bằng cách cố gắng tối đa các cài đặt này. WCF mặc định cho chúng như là một khởi đầu tốt. Ví dụ: * maxBufferSize * sẽ tự động được đặt thành * maxReceivedMessageSize * bằng WCF trừ khi bạn ghi đè bằng cách đặt giá trị được đặt. Nếu thường xuyên gửi các yêu cầu rất lớn (> 3 MB) cho dịch vụ thì bạn sẽ muốn đặt giá trị * maxBufferPoolSize * để khớp với giá trị * maxReceivedMessageSize *. [Bài đăng trên diễn đàn MSDN] (http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/d6e234d3-942f-4e9d-8470-32618d3f3212) có giải thích tốt về các cài đặt này. –

Trả lời

0

Lý do chính là một khách hàng cuối cùng đã thất bại buộc khách hàng phải kết nối lại quá thường xuyên (mỗi 5 giây), sau khi kết nối lại máy chủ/dịch vụ nhận được yêu cầu của khách hàng nhưng khách hàng lại bị hỏng, mỗi lần kết nối lại tạo ra một Phiên dịch vụ WCF sẽ chấm dứt chỉ trong vòng 2 phút vắng mặt của khách hàng, vì vậy trong 2 phút, một khách hàng đã tạo quá nhiều phiên về phía dịch vụ.

Tại sao một khách hàng bạc cuối cùng đã bị lỗi và ngắt kết nối? Xem sau bài trong đó mô tả một vấn đề thực tế và một giải pháp: WCF Silverlight client getting 404 not found response for poll message

vấn đề và giải pháp khác, được áp dụng, có lẽ ai thấy hữu ích:

Chủ đầu tư:

Vấn đề: Do kênh lý do khác nhau hoạt động gần có thể bị mắc kẹt phút CloseTimeout="00:03:00" gì là quá dài

giải pháp:

  • Set closeTimeout-10 giây như vậy trong trường hợp của bất kỳ vấn đề hoạt động gần sẽ bị buộc trong 10 giây để khách hàng làm sạch một cách nhanh chóng
  • Tăng thời gian chờ kết nối lại từ 5 giây đến 30 giây để cho tất cả mọi thứ releated để kết nối kênh cũ là phát hành/dọn dẹp

dịch vụ:

Vấn đề: Đôi khi tôi thấy dịch vụ mà bị mắc kẹt trong khi gọi khách hàng gọi lại (CallbackContract) cho sendTimeout=30minutes vì canno t hoạt động hoàn toàn do bị ngắt kết nối/client faulted nên dịch vụ dọn dẹp trì hoãn phút 30 nhưng nên càng nhanh càng tốt phát hành/làm sạch và xử lý trong trường hợp bị sự cố khách hàng/ngắt kết nối

Giải pháp:

  • Đặt sendTimeout thành 30 giây, điều này là quá đủ để gửi vài kilobyte qua mạng