项目中需要跨域传输流,并将流作为另一个应用程序域中创建的类构造函数的残失。
为了便于调试在webform中编写了如下代码:AppDomain Ad=AppDomain.CreateDomain("My Test Domain");
IMyInterface obj=(IMyInterface)a.CreateInstanceFromAndUnwrap("Test.Dll","TestClass",false,BindingFlags.Default,null,new object[3]{"Main Domain",Request.InputStream,Response.OutputStream},null,null,null);
/*Something*/
AppDomain.Unload(Ad);为了方便起见我用了HttpRequest.InputStream与HttpResponse.OutputStream来模拟项目中要操作的流。
Test.Dll的代码为public class TestClass:MarshalByRefObject, IMyInterface
{
public TestClass(string teststr,stream ins,stream outs)
{
outs.Write(Encoding.Default.GetBytes(teststr));//#1
byte[1] b=null;
for(int i=0;i<outs.Length;i++)
{
outs.Write(ins.Read(b,0,1));//#2
}
outs.Write(BitConverter.GetBytes(ins.Length));#3
}
}在执行时#1段代码执行正常,可以输出传入的"Main Domain"字符串
在执行#2段时,输出的都是nul(0x00)
在执行#3段时,可以正常获取ins的长度(也就是我POST上去的数据大小)
这里就是奇怪之处了:明明都是stream类型,outs的操作也完全正常,ins也能获取长度,为什么内容都被清空了?即使在构造函数加上ref参数也是一样,完全获取不到任何的值。难道stream在跨过应用程序域边界时会被清空?
求高人解惑。

解决方案 »

  1.   

    楼主的代码编译通不过,我用了FileStream 不会出现你说的问题。
    全部代码如下: protected void Page_Load(object sender, EventArgs e)
            {        }        protected void Button1_Click(object sender, EventArgs e)
            {
                AppDomain Ad = AppDomain.CreateDomain("My Test Domain");
                Class1 c = new Class1() { Name = "dfdf", Bytes = Encoding.Default.GetBytes("abddfd") };
                var ins = new FileStream(@"C:\log.log", FileMode.Create);            ins.Write(Encoding.Default.GetBytes("abddfd"), 0, Encoding.Default.GetBytes("abddfd").Length);
                
                ins.Position = 0;
                IMyInterface obj = (IMyInterface)Ad.CreateInstanceFromAndUnwrap(@"C:\Users\Administrator\Desktop\WebApplication1\Test\bin\Debug\Test.Dll",
                    "Test.TestClass",
                    false, BindingFlags.Default,
                    null, new object[]
                                                           {
                                                               "Main Domain", ins, Response.OutputStream
                                                           },                null, null, null);/*Something*/
                AppDomain.Unload(Ad);
                ins.Close();
            }
    [Serializable]
        public class TestClass : MarshalByRefObject, IMyInterface
        {
            public TestClass(string teststr, Stream ins, Stream outs)
            {
                var bytes = Encoding.Default.GetBytes(teststr);
                outs.Write(bytes, 0, bytes.Length); //#1
                byte[] b = new byte[8];            while (true)
                {
                    int count = ins.Read(b, 0, b.Length);
                    if (count > 0)
                    {
                        outs.Write(b, 0, count);
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
    namespace Test
    {
        public interface IMyInterface
        {
        } 
    }
      

  2.   

    Debug显示int count = ins.Read(b, 0, b.Length);读出来的是真实的数据,
    不过如果用Request.InputStream, 的确读出来的全部是 0x0.
      

  3.   

    Class1 c = new Class1() { Name = "dfdf", Bytes = Encoding.Default.GetBytes("abddfd") };可以删除。
      

  4.   

    是的,我使用FileStream甚至MemoryStream均没有问题,但就是Request.InputStream不能读取到任何数据。
    虽然现在工程不要求使用Request.InputStream作为输入,但难免以后会有这种需求,问题不解决心里总是不大舒服。
      

  5.   

    看了下
    Request.InputStream
    的实现,内部实现类是HttpInputStream
    保存数据的类是:
    HttpRawUploadedContent他们的声明如下:
     internal class HttpInputStream : Stream internal class HttpRawUploadedContent : IDisposableHttpRawUploadedContent
    没有实现MarshalByRefObject是不是这个的原因:楼主可以深入一下。
    有结果告知一下。
    我不想再研究下去了。
    猜测应该是HttpRawUploadedContent  没有实现MarshalByRefObject