项目中需要跨域传输流,并将流作为另一个应用程序域中创建的类构造函数的残失。
为了便于调试在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在跨过应用程序域边界时会被清空?
求高人解惑。
为了便于调试在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在跨过应用程序域边界时会被清空?
求高人解惑。
解决方案 »
- timer的问题,请大师给我提点提点,我是初学者
- c#中 string类的字符数统计
- 怎么实现 windows 我的电脑窗口的左边那栏点击后展现收起的功能
- 关于创建窗口句柄出错问题! OutOfMemoryException
- 如何为DataTable添加新的DataRow?
- 关于空格的处理
- int类型的结果如何在其后面追加小数显示位数?
- C#中如何实现变长参数的函数,类似c中的print 里面想放几个就放几个参数的那种,我只在网上找到了C类的文章,在C#中怎么实现??
- C#操作ACCESS数据库的几个疑问
- 中秋节快乐散分
- 数组个数
- SELECT 子句 (SQL Server Compact 4.0) DISTINCT怎么用?
全部代码如下: 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
{
}
}
不过如果用Request.InputStream, 的确读出来的全部是 0x0.
虽然现在工程不要求使用Request.InputStream作为输入,但难免以后会有这种需求,问题不解决心里总是不大舒服。
Request.InputStream
的实现,内部实现类是HttpInputStream
保存数据的类是:
HttpRawUploadedContent他们的声明如下:
internal class HttpInputStream : Stream internal class HttpRawUploadedContent : IDisposableHttpRawUploadedContent
没有实现MarshalByRefObject是不是这个的原因:楼主可以深入一下。
有结果告知一下。
我不想再研究下去了。
猜测应该是HttpRawUploadedContent 没有实现MarshalByRefObject