2012-10-18 30 views
6

Tôi có một dịch vụ WCF "cũ" khá lớn với nhiều phương pháp khác nhau.Thay đổi thời gian chờ cho mỗi phương thức WCF hoặc gọi

Hầu hết các phương pháp này là "bình thường", vì vậy chúng phải trả lời trong vòng chưa đầy 10 giây nhưng có một số phương pháp (8 hoặc 9) là các quy trình dài để chúng có thể mất nhiều thời gian để nhận phản hồi.

Receeasedout và sendtimeout được đặt thành 00:40:00 để đảm bảo họ có đủ thời gian để hoàn thành các quy trình này.

Vấn đề là đôi khi chúng ta có những vấn đề kết nối và các phương pháp "bình thường" mất một thời gian rất dài để sụp đổ ...

Họ là tất cả trong cùng một dịch vụ vì họ sử dụng một mô hình thực sự lớn và họ muốn tái sử dụng mô hình từ dịch vụ trong mọi cuộc gọi (không có PersonsService.User và RobotsService.User ... vì chúng là cùng một lớp trong các dịch vụ khác nhau).

Giải pháp đầu tiên tôi hình dung là tạo một Dịch vụ khác với các quy trình dài và đặt thời gian chờ ngắn thành dịch vụ bình thường ... nhưng tôi phải thực hiện nhiều thay đổi do sử dụng Mô hình ...

Có cách nào để đặt thời gian chờ khác nhau trong mỗi cuộc gọi không? Hoặc bằng phương pháp dịch vụ? Tôi có nên chunk Dịch vụ không?

Cảm ơn trước !!

+1

được bạn tái tạo lại đối tượng proxy cho mỗi cuộc gọi? nếu có, hãy xem liên kết này để có giải pháp có thể có: http://stackoverflow.com/questions/1826392/programatically-set-wcf-timeout-in-debug-mode – wal

+0

Không, tôi không phải, tôi là một singleton cho Ủy quyền. – zapico

Trả lời

7

Trước hết, thời gian chờ để định cấu hình trong trường hợp của bạn là OperationTimeout, cho phép giới hạn thời gian chờ dịch vụ trả lời trước khi hết giờ. Bạn có thể sửa đổi thời gian chờ hoạt động trước khi thực hiện cuộc gọi từ phía máy khách.

Để đặt OperationTimeout trên kênh, bạn có thể nhập trường hợp proxy/kênh của bạn là IContextChannel và đặt OperationTimeout.

Ví dụ:

IClientChannel contextChannel = channel as IClientChannel; 
contextChannel.OperationTimeout = TimeSpan.FromMinutes(10); 

HTH, Amit

+0

Và làm thế nào để cấu hình OperationTimeout này ?? Cảm ơn câu trả lời của bạn :) – zapico

+1

Đã chỉnh sửa câu trả lời của tôi để bao gồm thông tin được yêu cầu, chúc mừng! – amit

+1

Làm thế nào để bạn thực hiện điều đó một cách an toàn khi đối mặt với việc sử dụng đồng thời kênh? Đặt 'client.InnerChannel.OperationTimeout' và sau đó gọi dịch vụ từ nhiều luồng không hoạt động. Nhưng tôi biết rằng các thiết lập OperationTimeout được đọc một lần khi bắt đầu hoạt động, và sau đó giá trị đó vẫn không đổi cho lời gọi đó mặc dù bạn thay đổi OperationTimeout của kênh. Tôi chỉ không biết vị trí phù hợp sẽ ở đâu - nếu có một - để làm cho nó hoạt động trên các chủ đề. –

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