使用SslStream
方法从Read(byte[] buffer, int offset, int count)
正常读取时,我得到了预期的结果。
但是,如果我将SslStream
对象移到新的AppDomain
中,则读取似乎仍然可以正常工作(即,返回了读取的正确字节数),但是buffer
数组为空。
为什么是这样?
最佳答案
在some investigation之后,看来参数数组的内容未在AppDomain之间进行编组(可能是出于性能原因)。
因此,buffer
参数中的数据仅以一种方式传递。本地AppDomain中的调用者将看不到对远程AppDomain中的阵列所做的修改。
强制返回数组参数中的数据的方法是将[Out]
属性添加到参数。
要解决问题中所述的问题,请为SslStream
创建包装器类,并使用该包装器类:
[Serializable]
internal class SslStreamWrapper : SslStream
{
public SslStreamWrapper(
Stream innerStream,
Boolean leaveInnerStreamOpen,
RemoteCertificateValidationCallback validationCallback,
LocalCertificateSelectionCallback selectionCallback)
: base(innerStream, leaveInnerStreamOpen, validationCallback, selectionCallback)
{
}
// Add the [Out] attribute to the 'buffer' parameter.
public override Int32 Read([In, Out] Byte[] buffer, Int32 offset, Int32 count)
{
return base.Read(buffer, offset, count);
}
}
该类具有
[Serializable]
属性,允许在AppDomains之间传递它,并且包含隐式[In]
参数是为了与其他Stream类保持一致。从
Stream
继承的许多其他.NET类(例如MemoryStream
和BufferedStream
-甚至是Stream
本身)在[In, Out]
方法中包括buffer
参数的Read()
属性。我想知道是否为
SslStream
省略了它们是否是一个故意的选择...这适用于所有.NET版本。关于c# - 为什么跨AppDomains从SslStream读取成功但返回空缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11113921/