2009-12-01 38 views
10

Tôi đang sử dụng WCF trong giao dịch giữa máy chủ và máy khách (cả hai được viết bằng C#).Lập trình thiết lập thời gian chờ WCF ở chế độ gỡ lỗi

Ở chế độ phát hành, thời gian chờ sẽ được đặt thành ~ 20 giây, nhưng ở chế độ gỡ lỗi, tôi muốn đặt giá trị cao hơn để tôi có thể gỡ lỗi/bước trong mã của mình mà không hết thời gian chờ.

Tôi biết rằng tôi có thể thay đổi thời gian chờ bằng cách sửa đổi tệp app.config. Tuy nhiên, tôi có hai ràng buộc khác nhau và 4 giá trị thời gian trong mỗi vì vậy tôi sẽ phải thay đổi ở một vài nơi và dễ quên.

Để giải quyết vấn đề này, tôi muốn có một phần # DE DEUG nhỏ trong mã của tôi thay đổi theo chương trình giá trị thời gian chờ thành 1 giờ.

Tôi cố gắng để sử dụng đoạn mã sau để làm điều này:

Configuration configuration = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ServiceModelSectionGroup serviceModel = 
     ServiceModelSectionGroup.GetSectionGroup(configuration); 

BindingsSection bindings = serviceModel.Bindings; 

foreach (var configuredBinding in bindings.WSHttpBinding.ConfiguredBindings) 
{ 
configuredBinding.CloseTimeout = new TimeSpan(0, 30, 0); 
configuredBinding.OpenTimeout = new TimeSpan(0, 30, 0); 

nhưng * tính Timeout là readonly vì vậy tôi nhận được một lỗi biên dịch.

Tôi không thích ý tưởng tạo liên kết từ đầu theo chương trình. Nếu tôi thay đổi một số thuộc tính trong app.config, tôi phải nhớ thực hiện cùng một thay đổi trong mã để đảm bảo rằng hành vi gỡ lỗi tương tự như hành vi phát hành (ngoại trừ thời gian chờ ..)

Có ai có mẹo hay về cách xử lý việc này không?

Trả lời

12

Bạn có thể làm như sau:

  • tạo ra ràng buộc và các thiết bị đầu cuối trong mã
  • thiết lập timeout trên dụ ràng buộc
  • sau đó tạo proxy client của bạn sử dụng hai yếu tố

Một cái gì đó như:

BasicHttpBinding myBinding = new BasicHttpBinding("ConfigName"); 
myBinding.CloseTimeout = ....... 
myBinding.OpenTimeout = ....... 
myBinding.ReceiveTimeout = ....... 
myBinding.SendTimeout = ....... 

EndpointAddress myEndpoint = new EndpointAddress("http://server:8181/yourservice"); 

YourServiceClient proxy = new YourServiceClient(myBinding, myEndpoint); 

Bằng cách đó, bạn có thể tận dụng cấu hình cơ bản khi mô tả thời gian chờ ràng buộc và bạn có thể tinh chỉnh các cài đặt bạn muốn và tạo proxy máy khách từ nó.

2

Bạn có thể tạo liên kết thứ hai trong web.config và đặt sendTimeout dài hơn.

 if (debug) 
     { 
      proxy = new MyClient("WSHttpBinding_MyLocal"); 
     } 
     else 
     { 
      proxy = new MyClient("WSHttpBinding_MyDev"); 
     } 

     <wsHttpBinding> 
      <binding name="WSHttpBinding_MyLocal" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:20:00" 

...

+0

Trong một 'Client', thời gian chờ chỉ hầu hết mọi người bao giờ sẽ cần là' sendTimeout' https://social.msdn.microsoft.com/Forums/vstudio/en- US/84551e45-19a2-4d0d-bcc0-516a4041943d/giải thích-of-khác-timeout-type –

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