C# 处理IServerChannelSink.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远程处理)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引发异常时处理此问题的正确方法。它修复了服务器端抛出的异常,但我不知道这将如何影响接收响应参数的客户端
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;
}