2010-08-30 33 views
8

Tôi có ứng dụng được phân phối sử dụng .NET Remoting trên mạng gigabit trong nhà. Có một máy chủ duy nhất và hơn một chục máy khách kết nối với máy chủ. Các máy khách chạy nhiều luồng và có thể có tối đa 10 yêu cầu đồng thời từ mỗi máy khách.Nguyên nhân gây ra "vi phạm giao thức kênh Tcp mong đợi phần mở đầu" trong .NET Remoting?

Ứng dụng này hoạt động rất tốt hầu hết thời gian. Máy chủ luôn hoạt động trong nhiều tháng tại một thời điểm. Theo thời gian, tôi nhận được một ngoại lệ trên một khách hàng, và tôi không thể tìm ra nguyên nhân gây ra ngoại lệ. Ngoại lệ và theo dõi ngăn xếp là:

System.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble. 

Server stack trace: 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble() 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders() 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 

Đó là dấu vết ngăn xếp trở lại nơi tôi thực hiện cuộc gọi từ xa.

Tôi đã xem và không thể tìm thấy gì ngoài thông thường trong các cuộc gọi mà tôi đang thực hiện hoặc trong dữ liệu mà máy chủ đang trả về.

Google tìm kiếm lỗi này không hiệu quả lắm. Hầu hết các lỗi tôi đã thấy xoay quanh ai đó chuyển đổi từ HTTP sang TCP và không thay đổi tất cả mọi thứ, vì vậy họ nhận được ngoại lệ khi họ cố gắng kết nối. Trong trường hợp của tôi, khách hàng sẽ chạy cho ngày trước khi tôi nhận được lỗi này.

Một điểm dữ liệu khác: máy chủ không nhận được nhiều yêu cầu. Hầu hết các khách hàng là trình thu thập dữ liệu web mà mỗi người thực hiện hơn 2.000 yêu cầu tới máy chủ mỗi phút. Vì vậy, máy chủ đang xử lý tối đa 500 yêu cầu mỗi giây, với các lưu lượng truy cập cao hơn. Trong mọi trường hợp, máy chủ dường như xử lý lưu lượng truy cập ổn, và tôi sẽ mong đợi một lỗi khác nếu máy chủ bị quá tải.

Bất kỳ ý tưởng nào gây ra lỗi này?

+0

Khoản lỗ được chấp nhận? P – leppie

Trả lời

2

Lỗi này thường xảy ra khi một thư nhận được với tiêu đề sai. Bạn có thể lặp lại lỗi này bằng cách tạo kết nối telnet đến máy chủ của bạn và nhập một cái gì đó. Trong hầu hết các trường hợp, đó là lỗi mạng.

Tôi khuyên bạn nên kiểm tra tường lửa của mình. Một số tường lửa thả các gói mạng do cảnh báo tấn công sai.

Cân bằng tải là một lý do khác có thể. Load balancer tách các gói tin đến các máy chủ khác nhau.

+0

Nó rất có thể là tường lửa. Tôi đẩy rất nhiều lưu lượng truy cập thông qua nó và mặc dù nó có thể dễ dàng xử lý khối lượng lưu lượng truy cập trung bình, có lẽ có các cụm tràn bộ đệm của nó hoặc một cái gì đó. Tôi đang làm việc trên một số sửa đổi đối với mã của tôi sẽ làm mịn lưu lượng truy cập để loại bỏ điều tồi tệ nhất của những vụ nổ đó. –

+0

Nếu bất kỳ thuộc tính nào tồn tại trên đối tượng marshallbyref, bạn có thể thử chuyển đổi chúng thành phương thức. Mỗi lần bạn truy cập thuộc tính, nó sẽ gây ra một cuộc gọi tin nhắn. Chuyển đổi chúng thành các phương thức làm giảm thông điệp giữa máy khách và máy chủ. Ngoài ra bạn có thể serialize một số lớp cho bộ nhớ đệm của khách hàng. – ertan

+0

Không có bất kỳ thuộc tính có thể truy cập nào trên đối tượng từ xa. Có vẻ như đó là công tắc. Tôi đang đẩy một số lượng đáng kinh ngạc của các gói thông qua chuyển đổi này, và nó trông giống như việc chuyển đổi chỉ có thể không xử lý nó. Trong mọi trường hợp, tôi tin rằng lỗi không phải là lỗi phần mềm, mà là một vấn đề phần cứng. Cảm ơn vì sự trả lời. –

0

Tôi đã thấy sự cố này khi máy chủ MS DNS sử dụng quá nhiều cổng mở nên không thể tạo cổng ra. Vâng, nó rất buồn cười.

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