2009-06-12 29 views
8

Tôi có dịch vụ WCF đôi khi phải trả lại lỗi. Vì lý do nào đó, các cuộc gọi đến dịch vụ của tôi bắt đầu hết thời gian với lỗi sau: "Kênh yêu cầu đã hết thời gian chờ trong khi chờ trả lời sau 00: 00: 59.8906201. Tăng giá trị thời gian chờ được chuyển đến cuộc gọi đến Yêu cầu hoặc tăng Giá trị SendTimeout trên Binding. Thời gian được phân bổ cho hoạt động này có thể là một phần của thời gian chờ lâu hơn. "Tại sao dịch vụ WCF của tôi trả về FaultException, hết thời gian chờ sau 10 cuộc gọi?

Sau khi kiểm tra sự cố, một mẫu xuất hiện: Khi dịch vụ đã trả lại lỗi 10 lần, thời gian chờ bắt đầu. Vì vậy, tôi đã tạo ra một testservice thực hiện bởi:

public string GetData(int value) 
{ 
    throw new FaultException("A testerror occured"); 
} 

Và một testclient:

protected void RunTestGetData() 
    { 
     using (TestServiceReference.Service1Client client 
      = new WSPerformanceTester.TestServiceReference.Service1Client()) 
     { 
      try 
      { 
       client.GetData(1); 
       client.Close(); 
       outputWriter.WriteLine(string.Format("Call run in thread {0}: GetData()", Thread.CurrentThread.ManagedThreadId)); 
       outputWriter.Flush(); 
      } 
      catch (Exception e) 
      { 
       client.Abort(); 
       client.Close(); 
       outputWriter.WriteLine(string.Format("Error occured in thread {0}: GetData(): {1}", Thread.CurrentThread.ManagedThreadId, e.Message)); 
       outputWriter.Flush(); 
      } 
     } 
    } 

này chỉ xảy ra, khi dịch vụ được trả lại một FaultException. Nếu tôi ném một ngoại lệ thông thường, dịch vụ có thể tiếp tục chạy sau cuộc gọi thứ 10. Rõ ràng, tôi muốn bọc ngoại lệ của tôi độc đáo, vì vậy chỉ cần ném ngoại lệ bình thường không phải là một lựa chọn thực sự.

Tại sao tôi gặp phải các ngoại lệ thời gian chờ này? Cảm ơn trước vì bất kỳ trợ giúp nào ..

Trả lời

1

Rõ ràng, mã khách hàng nên thực hiện như sau:

protected void RunTestGetData() 
{ 
    TestServiceReference.Service1Client client 
     = new WSPerformanceTester.TestServiceReference.Service1Client() 
    try 
    { 
     client.GetData(1); 
    } 
    catch (FaultException e) 
    { 
     //Handle fault 
    } 
    try 
    { 
     if (client.State != System.ServiceModel.CommunicationState.Faulted) 
     { 
      client.Close(); 
     } 
    } 
    catch(Exception e) 
    { 
     outputWriter.WriteLine("Error occured in Client.Close()"); 
     outputWriter.Flush(); 
     client.Abort(); 
    } 
} 

Calling client.Abort() nên luôn có một phương sách cuối cùng.

+2

[cần dẫn nguồn] – piers7

1

Tôi có thể sai ở đây, nhưng tôi nghĩ rằng nó có liên quan đến việc lưu trữ dịch vụ WCF.

Do không thể trả lời yêu cầu kịp thời. Ví dụ:

IIS trên Windows XP có thể trả lời 5 (và tôi không chắc chắn về nó ngay bây giờ) yêu cầu đồng thời. Nếu có nhiều yêu cầu hơn, nó sẽ chuyển đến hàng đợi.

Và tôi tin rằng nó có thể mất các yêu cầu, và làm như vậy, không xử lý chúng, vì thử nghiệm của bạn thực sự không làm gì ngoài việc ném một ngoại lệ.

2

Tôi nghĩ điều này có thể là do hành vi mặc định của dịch vụ WCF là 10 phiên đồng thời. Bạn có giữ các kết nối mở sau khi FaultExceptions xảy ra không? Bạn có thể thử thay đổi giá trị này trong BehaviorConfiguration (ServiceThrottling> MaxConcurrentSessions) và xem có thay đổi gì không. Tôi đề nghị bạn sử dụng Trình soạn thảo cấu hình dịch vụ của Microsof để kiểm tra các giá trị khác được đặt theo mặc định. (MSDN)

hy vọng điều này giúp ...

+0

Nhưng không nên là khách hàng.() Hoặc khách hàngĐóng() đóng phiên? Và tại sao điều này chỉ xảy ra khi sử dụng FaultException? –

+0

Tôi có cùng câu hỏi với Jesper. Bất kỳ ai? –

+1

Xem câu trả lời của @ Jarrod268 để được giải thích ... cảm ơn! – RoelF

0

Hãy thử Client API WCF Service mẫu của tôi và xem kết quả tương tự xảy ra. Tôi nghĩ rằng có điều gì đó không đúng trong các mã khách hàng ...

The Code

The PPT

Ngoài ra, cho phép tiết WCF khai thác gỗ trên cả client và server ...

3

I don' t có đủ điểm để nhận xét, do đó phản hồi mới ...

Dịch vụ tự lưu trữ chỉ cho phép tối đa 10 kết nối đồng thời - bất kể vận chuyển là gì. Nếu bạn đang chạy các dịch vụ WCF bên trong IIS/WAS bạn không cần phải lo lắng về điều này (trừ khi bạn đang ở trên XP/Vista, nơi các kết nối đồng thời tối đa cũng là 10).

Sự khác biệt giữa ngoại lệ lỗi và ngoại lệ thông thường trong trường hợp này có thể giải thích kết quả bạn đang thấy.

Hãy nhớ rằng, ngoại lệ không được giải quyết thường xuyên sẽ gây lỗi cho kênh. Trong khi làm như vậy tôi giả định điều này sẽ mở ra một kết nối có sẵn. Khi bạn trả về lỗi, nó sẽ 'tự động lỗi kênh vì nó cho phép bạn làm điều gì đó với kết nối và xử lý lỗi trên đầu của bạn bởi vì nó có thể là lỗi "mong đợi" trong khi ngoại lệ chưa được giải quyết sẽ không xảy ra.

Ngay cả khi bạn trả lại lỗi, bạn vẫn cần phải hủy kết nối(). Ngoài ra, bên dưới có nguồn tài nguyên không được quản lý, do đó hãy chắc chắn triển khai IDisposable trên người gọi của khách hàng/proxy của bạn.

2

Tôi đang đối mặt với cùng một vấn đề. Một cái nhìn gần hơn tiết lộ rằng tôi đã không đóng máy khách webservice sau khi tôi đã thực hiện xong các cuộc gọi đến webservice. Một khi tôi đã làm điều đó, nó đã không thất bại ngay cả sau khi 10 phương thức gọi đến webservice. Xem ví dụ bên dưới.

WebServiceClient svcClient = new WebServiceClient(); 

string returnValue = svcClient.GetDocumentName(fileId); 

svcClient.Close(); 

mô hình thích hợp:

using(WebServiceClient svcClient = new WebServiceClient()) 
{ 
    return svcClient.GetDocumentName(fileId); 
} 

ClientBase thực hiện IDisposable, trong đó kêu gọi Close() trong phương pháp Dispose.

+3

Bạn không nên quấn các máy khách WCF của mình bằng cách sử dụng câu lệnh. Xem bài viết sau: http://msdn.microsoft.com/en-us/library/aa355056.aspx –

+0

cảm ơn sự cố này, rất khó để theo dõi vấn đề. dù sao cảm ơn vì đã đăng – zulucoda

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