2012-02-02 30 views
6

Tôi có ứng dụng Winforms được viết bằng C# sử dụng dịch vụ web từ máy chủ Windows Coldfusion IIS 2008. Tất cả các cuộc gọi dịch vụ web đều thành công nhưng một lỗi, không thành công khoảng 50% thời gian với lỗi sau:Lỗi khi sử dụng dịch vụ web: Kết nối hiện tại đã bị buộc đóng

System.InvalidOperationException được unhandled bởi mã người dùng Message = Có lỗi trong tài liệu XML (1254, 7).

với một ngoại lệ bên trong:

InnerException: System.IO.IOException = nhắn Không thể đọc dữ liệu từ kết nối giao thông: Kết nối hiện đã buộc phải đóng cửa bởi các máy chủ từ xa.

Tôi đã kiểm tra nhật ký IIS của mình và gặp lỗi 503 (Dịch vụ không khả dụng) và mã IIS 64 (Mạng được chỉ định không còn khả dụng). Bất kỳ đề xuất nào cũng sẽ rất tuyệt.

tôi chạy dịch vụ web của tôi trong giao diện người dùng SOAP và tôi nhận được lỗi sau:

javax.net.ssl.SSLException: Kết nối đã được tắt máy: javax.net.ssl.SSLException: java.net.SocketException: Thiết lập lại kết nối

Mã này hoạt động tốt ở một công ty nhưng lỗi này xuất hiện hầu như mọi lúc đối với công ty này mà tôi hiện đang làm việc.

+0

Kiểm tra nhật ký sự kiện Windows, đặc biệt là Nhật ký ứng dụng. BTW, các dịch vụ được _written_ trong Coldfusion? –

+0

Không có lỗi hoặc bất kỳ điều gì khác trong nhật ký sự kiện liên quan đến vấn đề này. Các dịch vụ được viết bằng Coldfusion. –

+0

Bạn đã liên hệ với nhà cung cấp dịch vụ web chưa? Nghe có vẻ giống như một vấn đề ở cuối đó, không nhất thiết phải trong ứng dụng tiêu thụ. –

Trả lời

0

Tôi đã nhận được lỗi tương tự và nguyên nhân là ngoại lệ trong tuần tự hóa XML. Chủ yếu là nếu xmlserializer cố gắng đọc một số thuộc tính và phương thức get sẽ làm tăng một ngoại lệ do một số kết nối cơ sở dữ liệu đã bị đóng hoặc bất kỳ tài nguyên nào không có sẵn.

Bạn đã cố đăng nhập ngoại lệ trong sự kiện lỗi bên trong global.asax chưa?

Đôi khi nếu global.asax không tăng sự kiện lỗi, thì chỉ có cách để ghi nhật ký lỗi thông qua bộ lọc phản hồi. Bạn có thể thêm bộ lọc phản hồi tùy chỉnh trong web.config, trong đó bạn sẽ có thể phân tích số lượng XML đã được tuần tự chính xác và nơi nó có thể bị lỗi.

http://msdn.microsoft.com/en-us/library/aa479332.aspx

http://www.raboof.com/projects/elmah/

+0

Global.asax là gì? Đây không phải là một chương trình ASP.net. Làm thế nào tôi sẽ đi về thêm một bộ lọc phản ứng tùy chỉnh để web.config? –

+0

Tôi đã thêm các liên kết liên quan –

1

Nếu bạn đang sử dụng một khách hàng WCF để kết nối với các dịch vụ, kích hoạt dịch vụ theo dõi đăng nhập vào ứng dụng khách hàng của bạn với các cấu hình sau:

<system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="System.ServiceModel" 
         switchValue="Error" 
         propagateActivity="true"> 
      <listeners> 
       <add name="sdt" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData= "ErrorTrace.svclog" 
         /> 
      </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 

Tải về các cửa sổ sdk và bạn có trình theo dõi dấu vết tốt đẹp cho các tệp nhật ký này. Nó giúp bạn có được dưới cùng của các lỗi trong giao tiếp WCF.

+0

Rất tiếc, tôi đang sử dụng WinForms (đây là một chương trình cũ hơn). Có bất kỳ tính năng truy tìm nào cho WinForms không? –

+0

Bạn vẫn có thể sử dụng một khách hàng WCF từ bên trong winforms - đó là nếu bạn đang ở trong .NET 3.0 hoặc mới hơn. –

1

Sử dụng giao tiếp nền tảng đôi khi điều đó xảy ra (một khi đã xảy ra với mã của tôi) rằng ngoại lệ được ném không phải là mô tả thực sự về những gì đang xảy ra bên trong.

Một nguyên nhân của ngoại lệ này là thời gian phản hồi của bạn hơi nhỏ hơn thời gian theo yêu cầu của phương pháp webservice để hoàn tất. Vì vậy, hãy thử tăng thời gian chờ trong app.config của bạn.

Nếu nó không hoạt động ở đó có thể là hai vấn đề có thể xảy ra trong trường hợp của bạn.

  1. Nếu SSL được sử dụng thì có vấn đề với hiệu lực chứng chỉ SSL.
  2. Có một số ký tự không hợp lệ được sử dụng trong XML ví dụ nền tảng của bạn không hỗ trợ các ký tự Unicode và có một số ký tự không được hỗ trợ được sử dụng trong XML.

Nhưng tôi hy vọng việc tăng thời gian chờ sẽ khắc phục điều này.

0

Trung gian "Kết nối hiện có bị đóng bởi máy chủ từ xa" từ chỉ một điểm đến có vẻ như là sự cố mạng với tôi.

Thử nhận nhật ký từ máy chủ mà bạn cố truy cập và từ tường lửa liên quan của cả hai vị trí. Bạn có thể chạy Fiddler hoặc NetMon/WireShark/Ethereal để chẩn đoán thêm.

0

Kết nối gần xảy ra trong mọi trường hợp. Hãy chắc chắn rằng thời gian chờ là phong phú trên máy chủ và máy khách, hãy chắc chắn rằng không có đệ quy trong dữ liệu bạn đang quay trở lại. Thông tư tham khảo. Serialization là quan trọng trong trường hợp này bởi vì điều đang được serialized khi trả lại.

Thực hiện theo dõi WCF và kiểm tra câu trả lời ở đó. Bất kỳ lỗi nào trong máy chủ sẽ đóng kết nối. Nếu máy chủ yêu cầu tên người dùng, hãy đảm bảo tên người dùng là chính xác. Chăm sóc lỗi SSL. sử dụng máy khách WCF để kiểm tra dịch vụ.

0

Đây có thể là một shot trong bóng tối nhưng đây là lý thuyết của tôi:

Lỗi đầu tiên đang xảy ra ở phía bên dịch vụ web với một ngoại lệ nghèo bị ném, có lẽ một số dữ liệu không hợp lệ đang được truyền vào dịch vụ? Điều này có thể trả về lỗi liên quan đến XML không đúng định dạng. Tôi sẽ thực hiện một số trường hợp kiểm tra để xem dữ liệu nào đang được chuyển vào dịch vụ và điều gì gây ra sự cố.

Lỗi thứ hai mà tôi đã thấy trước đây trong một trường hợp nhất định liên quan đến ngoại lệ dịch vụ web bị ném và một lần thử bắt xung quanh câu lệnh sử dụng dịch vụ. Sự kết hợp của logic này gây ra một lối thoát sớm mà không được dọn sạch.

0

thử để kiểm tra các giao thức hiện có trong công ty cuối cùng của bạn và so sánh chúng với công ty hiện tại của bạn, tôi có nghĩa là giao thức TCP/IP, ...

3

Gần đây tôi nhận được tin nhắn tương tự khi tiêu thụ một WCF Webservice. Trong trường hợp của tôi, nó đã bị lỗi là lỗi cấu hình ở phía máy chủ. Có lẽ một cái gì đó được cấu hình khác nhau trên một máy chủ mà điều này xảy ra với bạn? Vấn đề của tôi là kích thước thư tối đa mặc định được định cấu hình quá nhỏ trên máy chủ và điều này dẫn đến việc đóng kết nối cưỡng bức tương tự. Có kích thước tin nhắn tối đa là mặc định để tránh các cuộc tấn công DOS ...

0

Kiểm tra cấu hình tái chế của hồ bơi trong IIS. Tôi đã nhìn thấy lỗi này, ví dụ, khi "Giới hạn bộ nhớ riêng" được đặt thành một giá trị (nói 100mb) và sau đó quá trình w3wp vượt quá giới hạn này sẽ khiến hồ bơi ứng dụng được tái chế.

Điều này thường không phải là vấn đề vì mọi kết nối hiện có đều có thời gian hoàn thành và kết nối mới sẽ được xử lý bởi nhóm ứng dụng mới được tách ra.

Nếu tất cả các kết nối không được đóng trong giới hạn thời gian tắt (thường là 90 giây) thì chúng sẽ bị IIS chết và khách hàng có thể tăng lỗi "Kết nối hiện tại bị đóng buộc".

0

Tôi không chắc chắn điều này có thể áp dụng cho tình hình cụ thể của OP, nhưng điều này có thể giúp những người khác đến đây ngày nay. Một nguyên nhân tiềm năng cho ngoại lệ này liên quan đến các giao thức bảo mật không khớp. Nếu máy chủ bạn đang gọi yêu cầu TLS 1.2 và bạn đang sử dụng phiên bản ASP.net cũ hơn (< = Phiên bản 4.0), bạn sẽ sử dụng giao thức bảo mật cũ hơn để thực hiện cuộc gọi trừ khi bạn thay đổi. Bạn có thể ép ASP.net sử dụng TLS 1.2 (được hiển thị bên dưới). Điều này có thể được thực hiện ở bất kỳ nơi nào trong ứng dụng, nhưng tôi đặt ngay trước dòng gọi dịch vụ web yêu cầu TLS 1.2:

using System.Net; 

... 

//Enable TLS 1.2 
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 

// Call the Web Service that requires TLS 1.2 
Các vấn đề liên quan