我在自定义 IServerChannelSink 中偶尔会抛出异常(不记得确切的异常或消息),我编写该 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;
}
但是,如果 _nextSink.ProcessMessage 引发异常,我不确定将 responseMsg、responseHeaders 或 responseStream 保留为 null 是否是处理此问题的正确方法。它修复了服务器端抛出的异常,但我不知道这将如何影响客户端接收响应参数。我已经看到 HTTP 服务器接收器提供商的其他示例建议将标头设置为“400 错误请求”,但我们的协议是 TCP,我不认为将 TCP 标头设置为 HTTP 兼容值是正确的方法来处理这个。
处理 IServerChannelSink.ProcessMessage 实现中发生的错误的正确方法是什么?此外,也欢迎任何有关实现您自己的 IServerChannelSink 的指南或解释,因为我根据我在 SO 上提出的其他几个问题编写了本课程的大部分内容,否则会盲目。
编辑:我查看了 MSDN 的 IServerChannelSink 部分中的示例,但我不相信它,因为他们做了我知道不应该在实现类中发生的事情(例如抛出未处理的异常)
运行时:.NET 4
语言:C#
协议:TCP(.NET 远程处理)