我在一个自定义的IServerChannelSink中得到了一个偶然的异常抛出(不记得确切的异常或消息)我写的是通过标题从客户端获取其他数据。我已经修改了我的代码,以便在抛出异常时处理异常(在修改之前没有try / catch块):
public ServerProcessing ProcessMessage(
IServerChannelSinkStack sinkStack,
IMessage requestMsg,
ITransportHeaders requestHeaders,
Stream requestStream,
out IMessage responseMsg,
out ITransportHeaders responseHeaders,
out Stream responseStream)
{
// example of retrieving data from the client via the header, the client IP Address
IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
CallContext.SetData("ClientIPAddress", ip);
ServerProcessing? spres = null;
IMessage lResponseMsg = null;
ITransportHeaders lResponseHeaders = null;
Stream lResponseStream = null;
try
{
// _nextSink is a member object which is set in the constructor, or in the NextSink property
if (_nextSink != null)
{
spres = _nextSink.ProcessMessage(
sinkStack,
requestMsg,
requestHeaders,
requestStream,
out lResponseMsg,
out lResponseHeaders,
out lResponseStream);
}
}
catch { }
finally
{
responseMsg = lResponseMsg;
responseHeaders = lResponseHeaders;
responseStream = lResponseStream;
}
return (spres != null) ? (ServerProcessing)spres : ServerProcessing.Complete;
}
但是,我不确定将responseMsg,responseHeaders或responseStream保留为null是在_nextSink.ProcessMessage抛出异常的情况下处理此问题的正确方法。它修复了被抛出服务器端的异常,但我不知道这将如何影响接收响应参数的客户端。我已经看到HTTP服务器接收器提供程序的其他示例,建议将标头设置为“400 Bad Request”,但我们的协议是TCP,我不认为将TCP标头设置为HTTP兼容值是正确的方法处理这个。
处理IServerChannelSink.ProcessMessage实现中发生的错误的正确方法是什么?此外,我们也欢迎任何有关实施您自己的IServerChannelSink的指南或解释,因为我根据我提出的其他一些问题写了这个课程的大部分内容,而另外一些问题也是如此。
编辑 :我查看了MSDN的IServerChannelSink部分中的示例,但我不相信它,因为他们做的事我知道不应该发生在实现类(例如抛出未处理的异常)
运行时:.NET 4
语言:C#
协议:TCP(.NET Remoting)