#amazon-web-services #amazon-s3 #photon
#amazon-web-services #amazon-s3 #photon
Вопрос:
Я запускаю AWS SDK из приложения Photon Server и пытаюсь запросить содержимое корзины S3 с помощью AmazonS3Client.Метод ListObjectsV2() основан на примере с сайта AWS. Использование того же кода в другом приложении работает просто отлично, но в приложении Photon Server оно выводит следующее сообщение об ошибке в журналы Photon
2016-10-12 15:19:52,614 [11] ERROR Photon.SocketServer.ApplicationBase [(null)] - System.NullReferenceException: Object reference not set to an instance of an object.
at System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras)
at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String path)
at System.Configuration.UriSectionReader.GetSectionData()
at System.Configuration.UriSectionInternal.LoadUsingCustomParser(String appConfigFilePath)
at System.Configuration.UriSectionInternal.GetSection()
at System.Uri.InitializeUriConfig()
at System.Uri.InitializeUri(ParsingError err, UriKind uriKind, UriFormatExceptionamp; e)
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at Amazon.Runtime.AmazonServiceClient.ComposeUrl(IRequest iRequest)
at Amazon.Runtime.Internal.HttpHandler`1.CreateWebRequest(IRequestContext requestContext)
at Amazon.Runtime.Internal.HttpHandler`1.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.RedirectHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.Unmarshaller.InvokeSync(IExecutionContext executionContext)
at Amazon.S3.Internal.AmazonS3ResponseHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.S3.Internal.AmazonS3ExceptionHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.MetricsHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.RuntimePipeline.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.AmazonServiceClient.Invoke[TRequest,TResponse](TRequest request, IMarshaller`2 marshaller, ResponseUnmarshaller unmarshaller)
at Amazon.S3.AmazonS3Client.ListObjectsV2(ListObjectsV2Request request)
at AWSConnector.AWSConnector.ListSubfolders(String prefix)
at InstanceManager.Handlers.InstanceManagerUpdateInstancesHandler.OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
at Boson.Photon.Server.PhotonServerHandlerList.HandleMessage(IMessage message, PhotonServerPeer peer)
at Boson.Photon.Server.PhotonServerPeer.OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
at Photon.SocketServer.ServerToServer.ServerPeerBase.OnReceiveInternal(Byte[] data, SendParameters sendParameters, Int32 rtt, Int32 rttVariance, Int32 numFailures)
at Photon.SocketServer.PeerBase.<>c__DisplayClass6.<Photon.SocketServer.IManagedPeer.Application_OnReceive>b__5()
at ExitGames.Concurrency.Core.DefaultExecutor.Execute(Action toExecute)
at ExitGames.Concurrency.Core.DefaultExecutor.Execute(List`1 toExecute)
at ExitGames.Concurrency.Fibers.PoolFiber.Flush(Object )
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
Боюсь, это может иметь какое-то отношение к способу обработки потоков в Photon.
Ответ №1:
К сожалению, я считаю, что ни Photon, ни AWS здесь не задействованы. «Система.Безопасность.Разрешения.Завершение работы с файлом.Метод «CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras)» выдает NRE в других сценариях. Похоже, оно совпадает с одним из последних исправлений безопасности, внедренных Microsoft.
Например, это трассировка стека, с которой я сейчас борюсь:
at System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras)
at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String path)
at System.Web.InternalSecurityPermissions.PathDiscovery(String path)
at System.Web.HttpRuntime.get_CodegenDir()
Похоже, что виновником здесь является .NET 4.6.2.
Сравните FileIOPermission в 4.6.2 и FileIOPermission в 4.6.1 — они, очевидно, изменили проверки недопустимого пути, поэтому контракт конструктора FileIOPermission, вызывающего исключение ArgumentException для недопустимого пути, нарушен.
Комментарии:
1. Возникла проблема с . Команда NET.
2. Как ни странно, я использую ту же библиотеку DLL AWSConnector (.NET 4.5.2), которую я создал как в приложении Photon, так и в консольном приложении (оба .NET 4.5.2). Решена моя проблема при запуске консольного приложения из приложения photon вместо прямого использования dll из кода photon.
3. Я считаю, что цель сборки FW здесь на самом деле не имеет значения, это версия среды выполнения на целевой машине.
4. О, это имеет смысл, спасибо за разъяснение, @onyXMaster