Tôi có kiến trúc 3 tầng và gửi một số dữ liệu trong lớp vận chuyển (TCP Client) bằng cách sử dụng các ổ cắm tcp là phương pháp này không đồng bộ bằng phương pháp BeginSend.Lỗi ngoại lệ bị lỗi từ một cuộc gọi lại C#
public void TransportData(Stream stream)
{
try
{
SetTransporterState(StateObject.State.SendingData);
if (clientSock.Connected)
{
ASCIIEncoding asen = new ASCIIEncoding();
stream.Position = 0;
byte[] ba = GetStreamAsByteArray(stream);
if (clientSock.Connected)
clientSock.BeginSend(ba, 0, ba.Length, SocketFlags.None, new AyncCallback(SendData), clientSock);
else
throw new SockCommunicationException("Socket communication failed");
}
catch (SocketException sex)
{
throw sex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
}
catch (SocketException soex)
{
throw soex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
catch (Exception ex)
{
LoggingMessageHelper.LogDeveloperMessage(ex.Message + Environment.NewLine + ex.StackTrace, 1, TraceEventType.Critical);
bool rethrow = ExceptionPolicy.HandleException(ex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
Mã callback SendData() là dưới
private void SendData(IAsyncResult iar)
{
Socket remote = null;
try
{
remote = (Socket)iar.AsyncState;
try
{
int sent = remote.EndSend(iar);
}
catch (Exception ex)
{
throw ex;
}
if (remote.Connected)
{
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
}
else
throw new SockCommunicationException("Communication Failed");
}
catch (SocketException soex)
{
throw new SockCommunicationException("Communication Failed");
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
Khi ngắt kết nối máy chủ, khách hàng không biết cho đến khi nó sẽ gửi một số dữ liệu, do đó tài sản được kết nối đúng. Sau đó, dòng từ xa.BeginReceive() ném SocketException mà tôi cố gắng để nắm bắt và ném một ngoại lệ tùy chỉnh (sockCommunicationException).
Tuy nhiên, khi tôi làm điều này, tôi nhận được một ngoại lệ chưa được giải quyết. Tôi muốn bong bóng lỗi này tới giao diện người dùng thông qua lớp Doanh nghiệp. Khi một ngoại lệ như thế này được nâng lên trong phương thức gọi lại, nó được nâng lên đến đâu?
Làm cách nào để tránh ngoại lệ chưa xử lý này và bong bóng ngoại lệ này lên lớp Giao diện người dùng.
Vui lòng trợ giúp.
Cảm ơn trước!
Xin chào Aliostad, Vì vậy, bạn có nói rằng tôi có một đại biểu trong tầng giao vận và nâng cao một sự kiện được đăng ký bởi lớp kinh doanh khi lỗi này xảy ra? – user466898
Không, cách tiếp cận ưa thích của tôi là dành cho khách hàng để thăm dò ý kiến máy chủ nếu nó ** có ** để biết kết quả. – Aliostad
Tôi xin lỗi vì tôi không hiểu. Nếu trước đây tôi chưa giải thích rõ ràng, máy khách gửi yêu cầu và máy chủ trả lời lại với lỗi rằng nó đã ngắt kết nối máy khách. Đó là lý do tại sao tôi nhận được socketexception lớn lên với thông báo "Một kết nối được thiết lập đã bị hủy bỏ bởi phần mềm trong máy chủ của bạn" và mã lỗi "10053". Tôi nhận được lỗi này ném chỉ trong dòng từ xa.BeginReceive() trong phương pháp gọi lại. Tôi chỉ cần bong bóng lên trên. – user466898