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

C# 处理IServerChannelSink.ProcessMessage中发生的错误的正确方法是什么?,c#,.net,.net-4.0,tcp,.net-remoting,C#,.net,.net 4.0,Tcp,.net Remoting,在我编写的自定义IServerChannelSink中,偶尔会抛出一个异常(不记得确切的异常或消息),以便通过头从客户端获取额外数据。我对代码进行了这样的修改,以便在抛出异常时处理异常(在修改之前,没有try/catch块): 但是,我不确定将responseMsg、responseHeaders或responseStream保留为null是否是在_nextSink.ProcessMessage引发异常时处理此问题的正确方法。它修复了服务器端抛出的异常,但我不知道这将如何影响接收响应参数的客户端

在我编写的自定义IServerChannelSink中,偶尔会抛出一个异常(不记得确切的异常或消息),以便通过头从客户端获取额外数据。我对代码进行了这样的修改,以便在抛出异常时处理异常(在修改之前,没有try/catch块):

但是,我不确定将responseMsg、responseHeaders或responseStream保留为null是否是在_nextSink.ProcessMessage引发异常时处理此问题的正确方法。它修复了服务器端抛出的异常,但我不知道这将如何影响接收响应参数的客户端。我见过HTTP服务器接收器提供程序的其他示例,建议将头设置为“400错误请求”,但我们的协议是TCP,我也不认为将TCP头设置为HTTP兼容值是正确的处理方法

处理IServChannelSink.ProcessMessage实现中发生的错误的正确方法是什么?此外,任何关于实现您自己的IServerChannelSink的指南或解释都是受欢迎的,因为我在编写本课程的大部分内容时,都是基于我提出的其他几个问题,而不是盲目的

编辑:我看过MSDN的IServerChannelSink部分的示例,但我不相信它,因为它们做了我知道不应该在实现类中发生的事情(例如抛出未处理的异常)

运行时:.NET 4

语言:C#

协议:TCP(.NET远程处理)

  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;
  }