O processo de conexão do Unity ao AWS S3, AWS SDK para registros de armadilhas do Unity

AWS S3, serviço de servidor de recursos da Amazon, vem estudando esse conteúdo recentemente. Registre o conteúdo das armadilhas.

Depois de estudar as duas partes do AWS SDK para unidade e AWS SDK para .net
, é difícil conectar-se à unidade. O principal motivo é que não existe uma API oficial e a versão da unidade é usada com base no uso do .net versão.


A nomenclatura da API do AWS SDK é semelhante, independentemente da plataforma, e é dividida principalmente em 3 séries

  1. Consulta de lista
  2. Obter Obter, baixar
  3. Colocar upload

Interfaces principais:

inicialização

Cliente AmazonS3

m_AWSClient = new AmazonS3Client(strAccessKey, strSecretKey, regionEndpoint)

AccessKey, SecretKey, EndPoint precisam ser passados ​​durante a construção

Operações de objeto

GetObjectPutObject
_

Ocorreu um problema no Unity.
O GetObject não conseguiu obter o progresso do download, então essa API foi abandonada e o UnityWebRequest foi usado para download. Ocorreram várias exceções. Aqui estão dois pontos principais:

AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;
public CertificateHandlerPublicKey Certificate { get; private set; } = new CertificateHandlerPublicKey();

public class CertificateHandlerPublicKey : CertificateHandler
{
    protected override bool ValidateCertificate(byte[] certificateData)
    {
        return true;
    }
}

uwq = UnityWebRequest.Get(strURL);
uwq.certificateHandler = AWSProxy.Instance.Certificate;

Depois de configurá-lo, tudo ficará normal.

PutObject, carregue um arquivo. Normalmente faríamos essa operação de upload em modo não Runtime no Editor, mas uma coisa muito estranha aconteceu na AWS: o objeto principal AmazonS3Client relatou um erro, dizendo que não foi inicializado. AmazonS3Client precisa ser chamado antes de novo

UnityInitializer.AttachToGameObject(this.gameObject);

Fiquei instantaneamente chocado: esta é uma API Runtime, o que significa que o upload precisa ser feito enquanto o Unity está em execução. Depois de testar, descobri que é realmente possível.

Operação de permissão

GetACL
PutACL
Get não tem problema. Tentei colocar sob unidade e relatei um erro WebRequestHeader. emm...de acordo com a experiência, a solicitação não possui informações de cabeçalho, então apenas preencha as informações de cabeçalho. No entanto, AWS SDK A dll é empacotada. Isso é embaraçoso. Não é necessário interceptar o pacote e depois enviá-lo.
Então tentei a versão .net novamente, e não houve problema algum e poderia ser usada normalmente. Isso é incrível. Mas funciona.

Obter lista

ListObjects
encontrou um problema ao obter a lista. O AWS SDK solicitou conteúdo em um determinado caminho e retornou até 1.000 informações de arquivo. Qualquer outro seria perdido. A depuração descobriu que existe um campo NextMarker na estrutura retornada ListObjectsResponse .
Há também um marcador de campo em ListObjectsRequest. Tentei passar a nota retornada pela primeira vez para a próxima solicitação e obtive sucesso. Portanto, a AWS retorna as informações da lista de acordo com a lógica de paginação, com limite superior de 1.000. Faz sentido se você pensar bem. Por uma questão de desempenho e largura de banda de transmissão, para evitar que o tamanho do arquivo seja muito grande, a paginação é adotada.

		public void GetList(string strUrlPre, out bool isSuc, out Dictionary<string, long> result)
		{
			isSuc = true;
			result = new Dictionary<string, long>();

			Debug.Log("AWSApi Connect,Start GetList");

			string strMark = null;
			while (true)
			{
				ListObjectsRequest request = new ListObjectsRequest();
				request.BucketName = m_strBucket;
				request.Prefix = strUrlPre;
				request.Marker = strMark;
				try
				{
					ListObjectsResponse response = m_AWSClient.ListObjects(request);
					var listServer = response.S3Objects;
					for (int i = 0; i < listServer.Count; i++)
					{
						result.Add(listServer[i].Key, listServer[i].Size);
					}
					strMark = response.NextMarker;
					if (string.IsNullOrEmpty(strMark))
					{
						break;
					}
				}
				catch (System.Exception e)
				{
					isSuc = false;
					Debug.LogError("AWSApi Connect, Error : " + e.Message);
					break;
				}
			}
		}

Encontrei um problema ao baixar um texto do AWS S3.
Baixei o texto e obtive as informações do texto por meio do UnityWebRequest e descobri que o conteúdo da string era diferente do conteúdo carregado.

var task = UnityWebRequest.Get(strNetPath);
string strResult = task.downloadHandler.text;

Após a conclusão do download, task.downloadHandler.text é obtido;
depure e veja o conteúdo, que é igual ao conteúdo de texto que usei durante o upload. Mas a lógica subsequente não conseguiu analisar o conteúdo do texto.
Após a depuração, o conteúdo da string era o mesmo, então usei string.toChatArray() para verificar a diferença entre cada caractere. Descobri que as strings pareciam iguais, mas o primeiro caractere era um caractere vazio. String.trim era inválido para este caractere vazio por causa disso O caractere vazio e o segundo caractere formam a primeira palavra da string.

byte[] bytes = task.downloadHandler.data;

Também é errado obter bytes, há um conteúdo vazio no início.

O Baidu obteve uma explicação para este problema: https://blog.csdn.net/shersfy/article/details/54614720
É razoável... adicione o código.

string strResult = task.downloadHandler.text;
if (strResult[0] == 65279)
{
    strResult = strResult.Substring(1);
}
callBack?.Invoke(true, strResult);

Depois, há a questão do uso de ferramentas de produção .net.

A descrição de .net na documentação oficial é que a extensão no visual studio pode ser pesquisada por AWS e o plug-in pode ser encontrado.
Fingi e descobri que não adiantava, fiquei confuso e não expliquei nada.

Então, baixei manualmente a dll .net.
Ela é válida a partir de 3 de setembro de 2021. https://sdk-for-net.amazonwebservices.com/latest/v3/aws-sdk-net45.zip.
Se for inválido, em seguida, acesse o site oficial. Procurei por sdk para .net na caixa de pesquisa do site, mas foi muito difícil encontrá-lo.
Depois de descompactar a dll interna, adicione uma referência e use uma ferramenta do Windows para retirá-la.

Porque geralmente os contratos são emitidos em plataformas duplas, iOS e Android. O Android pode ser distribuído no Windows. A embalagem do iOS deve estar em uma máquina Mac.
Então eu tentei e executei o .net no mac.
O método mais direto é uma máquina virtual.

Meu modelo é um chip M1 , meu Deus. A partir de 1º de setembro de 2021, apenas o desktop paralelo poderá oferecer suporte a máquinas virtuais Windows no chip M1. Depois de instalar o sistema, instale o .net. Corra... tudo bem, sem resposta

Então a solução foi substituída, porque o .net pode ser executado diretamente no mac, e isso pode ser feito pelo Baidu.
donet pode iniciar diretamente o aplicativo principal do console da web .net.
Tentei olá mundo e funcionou normalmente sem problemas.

Continue tentando as interfaces relevantes do AWS SDK para .net, mas falha. A mensagem de erro é que AWSConfig está executando uma operação de arquivo local e não consegue encontrar o caminho.
Acabou, com preguiça de fazer isso, declarou fracasso .

Portanto, ainda usamos SVN para sincronizar o conteúdo que precisa ser carregado na intranet e operá-lo em uma máquina Windows.


Depois, há o empacotamento. Não há problema em empacotar o APK, mas ao executar
, você descobrirá que AmazonS3Client lançará uma exceção MissingMethodException quando for novo.
O AWS SDK for Unity contém muitas DLLs após a importação e o arquivo so não tem nada a ver com as informações de log.
Portanto, o problema vem da dll. Se você verificar a dll, descobrirá que
Insira a descrição da imagem aqui
o Targets .net 3.5 final
é .net2.0 por padrão no Unity2019. Em seguida, altere-o e aumente a versão .net do Unity.
Então descobri que o erro MissingMethodException ainda ocorre.
Pense nisso, ao executar o código não pode ser encontrado, mas está bom no PC, então pode ser cortado pelo código, depois adicione link.(código de unidade link.xml Relacionado ao corte, você pode ir para o Baidu)

<?xml version="1.0" encoding="utf-8"?>
<linker>
  <assembly fullname="AWSSDK.CognitoIdentity" preserve="all" />
  <assembly fullname="AWSSDK.Core" preserve="all" />
  <assembly fullname="AWSSDK.S3" preserve="all" />
  <assembly fullname="AWSSDK.SecurityToken" preserve="all" />
</linker>

Continue, o erro ainda ocorre, aparecendo em

AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;

Essa linha de código aparece, e ainda é um problema de redução.

NullReferenceException: Object reference not set to an instance of an object.
      at Amazon.Runtime.Internal.UnityWebRequestWrapper..cctor () [0x00000] in <00000000000000000000000000000000>:0 
      at Amazon.AWSConfigs.set_HttpClient (Amazon.AWSConfigs+HttpClientOption value) 

AWS的内部异常是:
TypeInitializationException

Depois de uma tentativa

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandlerRaw" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandlerBuffer" preserve="all" />
  </assembly>
	<assembly fullname="AWSSDK.CognitoIdentity" preserve="all"/>
	<assembly fullname="AWSSDK.Core" />
	<assembly fullname="AWSSDK.S3" />
	<assembly fullname="AWSSDK.SecurityToken" />
</linker>

Uau, consegui.

Então, durante o processo de execução da lógica, descobri um problema
relacionado a List na API do AWS SDK, como ListBucketsAsync. Ao executar no Android, não haverá CallBack, nem tempo limite, nem herança. Estou muito confuso. Como não há API no AWS SDK para provar que a conexão foi bem-sucedida, a ideia de usar as informações do bucket para testar se a conexão pode ser bem-sucedida falhou.

Reclamei novamente.
Realmente não há explicação na API oficial da AWS. Não há documentação oficial da unidade. Só consigo encontrar no fórum, mas esse tipo de erro é difícil de procurar.

Então, vamos usar a API do Unity. UnityWebRequest.

Segurança:

AWSProxy.Instance.GenerateDynamicURL

Esta tentativa de API pode ser usada e retorna o URL corretamente.
Produz principalmente uma sequência de URLs com informações criptografadas.
Se a conta durante a inicialização tiver permissões, o download poderá ser bem-sucedido, caso contrário, um erro HTTP será retornado.


A programação é infinita.
Todos são bem-vindos para se comunicar. Se houver algo incerto ou errado, você também pode conversar comigo em particular.
Meu QQ 334524067 God-like Didi

Acho que você gosta

Origin blog.csdn.net/qq_37776196/article/details/120034272
Recomendado
Clasificación