1

我在自定义 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 远程处理)

4

0 回答 0