这是使用sink provider的代码,如果用BinaryServerFormatterSinkProvider 就没问题,如果用自定义的provider,当在服务器端访问一个文件的时候报异常。System.Security.SecurityException occurred
Message="Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
Source="mscorlib"
StackTrace:
at System.Security.FrameSecurityDescriptor.CheckDemand2(CodeAccessPermission demand, PermissionToken permToken, RuntimeMethodHandle rmh, Boolean fDeclarative)
InnerException: //BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
//provider.TypeFilterLevel = TypeFilterLevel.Full; InspectionServerSinkProvider provider = new InspectionServerSinkProvider();
provider.Next = new BinaryServerFormatterSinkProvider();
下面是自定义的sink的代码:public class InspectionServerSinkProvider : IServerChannelSinkProvider, IServerFormatterSinkProvider
{
private IServerChannelSinkProvider next; /// <summary>
/// Initializes a new instance with default parameters.
/// </summary>
public InspectionServerSinkProvider()
{
} public void GetChannelData(IChannelDataStore channelData)
{
if (next != null)
{
next.GetChannelData(channelData);
}
} public IServerChannelSink CreateSink(IChannelReceiver channel)
{
IServerChannelSink sink = null; if (next != null)
{
IServerChannelSink nextSink = next.CreateSink(channel);
sink = new InspectionServerSink(nextSink);
} return sink;
} public IServerChannelSinkProvider Next
{
get { return next; }
set { next = value; }
}
}public class InspectionServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
{
private IServerChannelSink next;
private IPAddress firstTimeIP; public InspectionServerSink(IServerChannelSink next)
{
this.next = next;
} public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, Object state, IMessage msg,
ITransportHeaders headers, Stream stream)
{
}
public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack, Object state, IMessage msg,
ITransportHeaders headers)
{
return null;
} public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg,
out ITransportHeaders responseHeaders, out Stream responseStream)
{
IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
long connectionId = (long)requestHeaders[CommonTransportKeys.ConnectionId];
Console.WriteLine(ip.ToString()); result = next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); return result;
} public IServerChannelSink NextChannelSink
{
get { return next; }
set { next = value; }
} }
能设置自定义sink provider的这个属性吗?
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 这句话好像要加在assembly文件中