处理IServerChannelSink.ProcessMessage中发生的错误的正确方法是什么?

时间:2013-06-26 16:02:26

标签: c# .net .net-4.0 tcp .net-remoting

我在一个自定义的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)

0 个答案:

没有答案