2011-08-26 37 views
45

Tôi có dịch vụ web WCF hoạt động tốt. Tuy nhiên, có một cuộc gọi cụ thể không thành công - nhưng chỉ thất bại đối với một số người dùng nhất định. Cuộc gọi là khá đơn giản - đó là một cuộc gọi để có được một danh sách các đối tượng Person.Kết nối hiện có bị đóng bởi máy chủ từ xa - WCF

Đối với người dùng A nó hoạt động tốt. Dịch vụ truy vấn cơ sở dữ liệu, tạo danh sách các đối tượng Person và trả về nó trở lại ứng dụng gọi.

Đối với người dùng B không thành công. Điều kỳ lạ là khi tôi gỡ lỗi dịch vụ có vẻ hoạt động tốt. Nó có thể truy vấn cơ sở dữ liệu và nó tạo ra đối tượng List và trả về nó. Bản thân dịch vụ không bao giờ thất bại. Nhưng ứng dụng máy khách nhận được lỗi "Kết nối hiện tại bị buộc phải đóng bởi máy chủ từ xa".

Đối với tôi, có vẻ như có điều gì đó đang xảy ra khi lớp dịch vụ cố gắng đóng gói dữ liệu ở định dạng XML để gửi lại cho ứng dụng gọi điện. Tôi nghĩ rằng nó phải là một vấn đề liên quan đến dữ liệu bởi vì cuộc gọi hoạt động tốt cho những người dùng khác. Tôi đã xem xét dữ liệu một cách trực quan và tôi thực sự không thấy bất cứ điều gì kỳ quặc. Một giả định là dữ liệu cho Người dùng B có một số ký tự ẩn hiện đại hoặc thứ gì đó và do đó khiến dịch vụ đóng đột ngột. Một cái gì đó như thế.

Bất kỳ ý tưởng nào?

+0

Có thể nó giúp - tôi đã xóa ứng dụng dịch vụ web khỏi máy chủ trong khi dịch vụ được gọi từ khách hàng và tôi gặp lỗi này trong nhật ký lỗi của mình .. – xameeramir

Trả lời

71

Điều tốt nhất tôi đã tìm thấy để chẩn đoán những thứ như thế này là trình theo dõi dịch vụ. Nó khá đơn giản để thiết lập (giả sử bạn có thể chỉnh sửa configs):

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

Hope this helps.

+12

Điều này đã giúp! Tôi đã có một vấn đề tương tự và trong trường hợp của tôi, ServiceTraceViewer cho tôi thấy một ngoại lệ được ném trong khi cố gắng sắp xếp một giá trị enum. Các hoạt động đã cố gắng để trả lại một đối tượng bao gồm enum này mà không initalizing nó đầu tiên, và định nghĩa enum không có thành viên cho giá trị mặc định (0). Vì vậy, nó không thể serialize 0. –

+0

Tôi đã làm điều này và nó cho phép tôi xác định vấn đề. Trong trường hợp của tôi nó là một NullReferenceException trong quá trình serialization trở lại cho khách hàng. Đây là những gì tôi muốn biết: Tại sao ngoại lệ ban đầu của tôi bị chôn vùi trong vấn đề kết nối này? Nó thậm chí không phải là bất kỳ ngoại lệ bên trong, nhưng nó là nguyên nhân của vấn đề. Đây là chậm và tôi cần phải tìm ra cách để vượt qua điều này. Tôi có thể đăng một câu hỏi mới ... – toddmo

11

Tôi đã thấy điều này một lần. Người dùng có yêu cầu số lượng dữ liệu khác nhau không? Tôi thấy rằng ngay cả khi bạn có thể định cấu hình ràng buộc cho tải trọng dữ liệu (tức là maxReceivedMessageSize), thì httpRuntimemaxRequestLength vượt qua cài đặt WCF, vì vậy nếu IIS đang cố gắng phân phối yêu cầu vượt quá mức đó, nó thể hiện hành vi này.

nghĩ về nó như thế này:

Nếu maxReceivedMessageSize là 12MB trong hành vi WCF của bạn, và maxRequestLength là 4MB (mặc định), IIS thắng.

+2

Tôi không nghĩ vậy. Tôi đã thử sửa đổi dữ liệu đã được trả lại để giảm nó và nó không hoạt động. Truy vấn bình thường trả về 63 hàng. Tôi đã thay đổi nó để chỉ trả về 1 hàng và nó vẫn không thành công. Dữ liệu cho Người dùng A trả về 26 hàng và nó hoạt động tốt. Khi tôi sửa đổi dữ liệu cho Người dùng B để chỉ trả về 1 hàng - nó vẫn không thành công. Rất lạ. –

22

Tôi gặp sự cố này vì trang web của tôi không có chứng chỉ được liên kết với cổng SSL. Tôi nghĩ rằng tôi muốn đề cập đến nó bởi vì tôi đã không tìm thấy câu trả lời này bất cứ nơi nào trong googleweb và nó đã cho tôi giờ để tìm ra nó. Không có gì xuất hiện trong trình xem sự kiện, điều này hoàn toàn tuyệt vời để chẩn đoán nó. Hy vọng điều này sẽ giúp người khác đau đớn.

6

Tôi chỉ có lỗi này bây giờ trong chỉ máy chủ và các giải pháp là để thiết lập một thuộc tính maxItemsInObjectGraph trong WCF web.config dưới <behavior> tag:

<dataContractSerializer maxItemsInObjectGraph="2147483646"/> 
3

Tôi đã đánh bắt các ngoại lệ tương tự và tìm thấy một InnerException: SocketException. trong dấu vết svclog.

Sau khi tìm trong nhật ký sự kiện cửa sổ, tôi thấy lỗi xuất phát từ lớp System.ServiceModel.Activation.TcpWorkerProcess.

Bạn có đang lưu trữ dịch vụ wcf trong IIS bằng tính năng chia sẻ kết nối và chia sẻ cổng không?

Dường như có một lỗi trong IIS tính năng chia sẻ cổng, kiểm tra fix:

Giải pháp của tôi là để lưu trữ dịch vụ WCF của bạn trong một dịch vụ Windows.

+0

Đây là phiên bản cũ của IIS, như 6? Kể từ khi "sửa chữa" là từ năm 2011 và liên kết tải xuống thậm chí đã biến mất ... –

3

Tôi gặp vấn đề tương tự. Giải pháp của tôi là thế này:

Nếu bạn sử dụng linq2sql trong dự án của bạn, Mở tập tin dbml của bạn trong Visual Studio và thay đổi serialization Mode để "Unidirectional" trên

3

Sau khi kéo tóc của tôi ra cho như 6 giờ này hoàn toàn vô dụng lỗi, vấn đề của tôi đã kết thúc là data transfer objects của tôi quá phức tạp. Bắt đầu với các thuộc tính đơn giản uber như public long Id { get; set;} đó là ... không có gì lạ mắt.

+1

Đối tượng của tôi có tham chiếu đệ quy. –

2

Sự cố tôi gặp phải với việc tuần tự hóa. Nguyên nhân là một số lớp DTO/kinh doanh và thuộc tính của tôi đã được đổi tên hoặc xóa mà không cập nhật tham chiếu dịch vụ. Tôi ngạc nhiên là tôi không nhận được số contract filter mismatch error. Nhưng việc cập nhật ref dịch vụ đã sửa lỗi cho tôi (cùng lỗi với OP).

2

Trong trường hợp của tôi, nó cũng đã được tuần tự hóa. Tôi cần phải thêm [KnownType(typeof(...)] cho tất cả các lớp có thể xuất hiện trong tuần tự hóa.

7

Tôi thấy rằng bạn có thể nhận được lỗi này nếu đối tượng được trả về chỉ lấy các thuộc tính tự động được khởi tạo trong hàm tạo (với cú pháp C# 6.0).

Tôi tin rằng điều này là do WCF deserializing các đối tượng ở phía máy khách bằng cách sử dụng một constructor tham số-ít hơn sau đó thiết lập các thuộc tính trên đối tượng. Nó cần phải có một số setcó sẵn (có thể là riêng tư) để điền vào đối tượng, nếu không nó sẽ thất bại.

+0

O .... Thiên Chúa .... của tôi .... cảm ơn bạn rất nhiều vì câu trả lời này. Tôi tự hỏi tại sao điều này không được đề cập hoặc bị bắt tại thời gian biên dịch. – DdW

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