Исключение сериализации при запуске Apache Ignite 2.7 в Net Framework 4.7.1 - PullRequest
0 голосов
/ 27 декабря 2018

Я кодировал службу Ignite .Net в C #, которая работает на Linux / NET Core 2.2.Сейчас я пытаюсь использовать его в веб-приложении .Net Framework.

    Ignition.ClientMode = true;

    var igniteCfg = new IgniteConfiguration()
    {
        IgniteHome = System.Web.HttpContext.Current.Server.MapPath(@"~\bin\")
    }; 

    using (var ignite = Ignition.Start(igniteCfg))
    {
        var services = ignite.GetServices();
        IQuoteGeneratorContract proxy = services.GetServiceProxy<IQuoteGeneratorContract>("QuoteService");
        quotes = proxy.GenerateQuotes(quoteRequestMapped);
    }

Однако при вызове Ignition возникает странное исключение:

    Type 'Domain.ElasticCachedReference`1[[Domain.Partner, Utility.Click.Domain, Version=3.10.56.40, Culture=neutral, PublicKeyToken=null]]' in Assembly 'Utility.Click.Domain, Version=3.10.56.40, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Stack Trace:

Server stack trace: 
   at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
   at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage..ctor(IMethodCallMessage mcm)
   at System.Runtime.Remoting.Messaging.SmuggledMethodCallMessage.SmuggleIfPossible(IMessage msg)
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)

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 System._AppDomain.CreateInstanceFrom(String assemblyFile, String typeName)
   at Apache.Ignite.Core.Impl.Unmanaged.Jni.Jvm.GetCallbacksFromDefaultDomain()
   at Apache.Ignite.Core.Impl.Unmanaged.Jni.Jvm..ctor(IntPtr jvmPtr)
   at Apache.Ignite.Core.Impl.Unmanaged.Jni.Jvm.GetOrCreate(IList`1 options)
   at Apache.Ignite.Core.Impl.IgniteManager.CreateJvmContext(IgniteConfiguration cfg, ILogger log)
   at Apache.Ignite.Core.Ignition.Start(IgniteConfiguration cfg)
   at Domain.ServiceAdapters.QuoteServiceAdapter.GenerateQuotes(IEnumerable`1 products, Tender tender, Dictionary`2 customCPs) in C:\Users\alexavrutin\Projects\utilityclick\src\Domain\-Logic\ServiceAdapters\QuoteServiceAdapter.cs:line 54
   at Domain.Tender.Submit(Object shardingKey, TenderOptions tenderOptions, Boolean isSkipRecalcManualQuotes, Dictionary`2 customCPs, Boolean forceGenerateSMEQuotes) in C:\Users\alexavrutin\Projects\utilityclick\src\Domain\-Logic\Tender.cs:line 616

Я должен сказать, что сообщение об исключении абсолютно верно: тип Domain.ElasticCachedReference действительно не помечен как [Serializable].Однако я не использую этот тип в любом сервисе Ignite и не храню его в кэше Ignite.Я просто пытаюсь запустить Ignite в том же приложении, где этот класс определен и используется, и, в конце концов, я только запускаю Ignite и еще не вызываю какую-либо службу или не выполняю распределенное закрытие.

Я рассмотрел исходный код Ignite и подозреваю, что исключение выдается в методе Net Framework и, вероятно, связано с тем, как тип создается экземпляром Activator, а не с самим Ignite.Однако мне интересно, как я могу предотвратить возникновение этого исключения?Спасибо!

На компьютере, на котором работает клиент, используется следующее программное обеспечение: Windows 10 Pro, Visual Studio 2017, C # 7.1, Net Framework 4.7.1 с ASP.NET, Apache Ignite .Net 2.7 * 1014.*

...