Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[.NET] Как правильно использовать делегаты удалённо? 21.11.04 00:08
Автор: Бяша <Biasha> Статус: Member Отредактировано 21.11.04 00:11 Количество правок: 1
|
Скажите, пожалуйста, как передать серверу функцию обратного вызова?
Пример "Remoting Example: Delegates and Events" из MSDN у меня вызывает то же самое исключение, что и мой код ниже.
Каких таких прав не хватает, и как их дать?
Пробовал поместить все сборки в GAC, назначал им явно FullTrust, хоть они и так не имеют ограничений - не помогло.
program output:
Unhandled Exception: System.Security.SecurityException: Request for the permission of type System.DelegateSerializationHolder failed.
Server stack trace:
at System.Runtime.Serialization.FormatterServices.CheckTypeSecurity(Type t, TypeFilterLevel securityLevel)
at System.Runtime.Serialization.Formatters.Soap.ObjectReader.CheckSecurity(ParseRecord pr)
at System.Runtime.Serialization.Formatters.Soap.ObjectReader.ParseObject(ParseRecord pr)
at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Parse(ParseRecord pr)
at System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()
at System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
at System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()
at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)
at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)
at System.Runtime.Remoting.Channels.CoreChannel.DeserializeSoapRequestMessage(Stream inputStream, Header[] h, Boolean bStrictBinding, TypeFilterLevel securityLevel)
at System.Runtime.Remoting.Channels.SoapServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Server.AtServ(SomeFunk funk)
at Client.Main(String[] Args)
make.bat
csc /t:library RemoteType.cs
csc /r:RemoteType.dll server.cs
csc /r:RemoteType.dll client.cs
RemoteType.cs
using System;
public class Server : MarshalByRefObject
{
public delegate void SomeFunk();
public void AtServ(SomeFunk funk)
{}
}
client.cs
using System;
using System.Runtime.Remoting;
public class ClassWithFunk : MarshalByRefObject
{public void funk(){}}
public class Client
{
public static void Main(string[] Args)
{
RemotingConfiguration.Configure("client.exe.config");
Server srv = new Server();
ClassWithFunk cwf = new ClassWithFunk();
Server.SomeFunk funk = new Server.SomeFunk(cwf.funk);
srv.AtServ(funk);
}
}
client.exe.config
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown
type="Server, RemoteType"
url="http://localhost:8080/Server.rem"
/>
</client>
<channels>
<channel ref="http" port="0"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
server.cs
using System;
using System.Runtime.Remoting;
public class Server
{
public static void Main(string[] Args)
{
RemotingConfiguration.Configure("server.exe.config");
Console.WriteLine("The server is listening. Press Enter to exit....");
Console.ReadLine();
}
}
server.exe.config
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
type="Server, RemoteType"
objectUri="Server.rem"
mode="SingleCall"
/>
</service>
<channels>
<channel ref="http" port="8080"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
---
|
|
[.NET] Уже работает, но binary тормозит, а soap не передаёт char. 21.11.04 16:15
Автор: Бяша <Biasha> Статус: Member
|
Судя по всему, проблема в .NET 1.1.
А может и наоборот - в 1.0.
Короче, оказалось, что в 1.1 у форматеров появилось поле TypeFilterLevel, которого нет в моей документации, и которое нужно было установить в Full.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconAutomaticDeserializationInNETRemoting.asp
Но, появилась новая проблема:
При вызове функции обратного вызова с параметром char, с плохим символом (например 0х10) soap форматер, видимо, некорректно его загоняет в xml и потом на сервере возникает исключение при разборе xml.
А при использовании бинари форматера всё работает, но каждая передача связанная с делегатом тормозит секунд по 10...
Может хоть это поможете?
server.exe.config правильный
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
type="Server, RemoteType"
objectUri="Server.rem"
mode="SingleCall"
/>
</service>
<channels>
<channel ref="http" port="8080">
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
---
|
|
|