使用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类(例如MemoryStreamBufferedStream-甚至是Stream本身)在[In, Out]方法中包括buffer参数的Read()属性。

我想知道是否为SslStream省略了它们是否是一个故意的选择...这适用于所有.NET版本。

关于c# - 为什么跨AppDomains从SslStream读取成功但返回空缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11113921/

10-10 02:57