我在移动应用程序中实现了AmazonSimpleDB,并使用凭据文件中的秘密访问密钥使其全部工作。据我所知,这对移动应用程序来说是不起作用的,也不安全,所以我考虑使用Cognito来验证用户,并允许他们访问SimpleDB。
我让Cognito正确连接和同步,但出于某种原因,当我将凭据传递给新的AmazonSimpleDBClient,然后调用一个select表达式时,它会弹出一条"Argument cannot be null"消息。
我就是这样称呼它的:
//Connect to the DB
var sdb = new AmazonSimpleDBClient(
credentials: Credentials,
region: RegionEndpoint.USWest2);
//Check if this user has any bots yet
string selectExpression = "Select count(*) From Bots where UserName = '" + username + "'";
var selectRequestAction = new SelectRequest { SelectExpression = selectExpression };
var selectResponse = sdb.Select(selectRequestAction);
凭据就是这样设置的:
private CognitoAWSCredentials Credentials
{
get
{
if (_credentials == null)
_credentials = new CognitoAWSCredentials("IDENTITY_POOL_ID", RegionEndpoint.APSoutheast2);
return _credentials;
}
}
我似乎找不到任何与这个问题有关的东西,甚至没有人试图这样使用SimpleDB——他们似乎都使用硬编码凭据,同时说它不安全。。。
EDIT(完全错误)ArgumentNullException:参数不能为null。参数名称:键系统集合。通用的字典`2[System.Type,Amazon.Runtime.IExceptionHandler].TryGetValue(System.Type键,IExceptionHandler&value)(位于/Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:588)亚马逊。运行时。内部的错误处理程序。ProcessException(IExecutionContext executionContext,System.Exception异常)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Peline/ErrorHandler/ErrorHandler.cs:202)亚马逊。运行时。内部的错误处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3阶段发布/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Pipeline/ErrorHandler/ErrorHandler.cs:78)亚马逊。运行时。内部的管道处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/PipelineHandler.cs:57)亚马逊。运行时。内部的回调处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Pipeline/Handlers/CallbackHandler.cs:45)亚马逊。运行时。内部的管道处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/PipelineHandler.cs:57)亚马逊。运行时。内部的签名者。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Pipeline/Handlers/Signer.cs:38)亚马逊。运行时。内部的管道处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/PipelineHandler.cs:57)亚马逊。运行时。内部的凭证检索器。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Pipeline/Handlers/CredentialsRetriever.cs:72)亚马逊。运行时。内部的管道处理程序。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/PipelineHandler.cs:57)亚马逊。运行时。内部的RetryHandler。InvokeSync(IExecutionContext executionContext)(位于E:/JenkinsWorkspaces/v3 stage release/AWSDotNetPublic/sdk/src/Core/Aamazon.Runtime/Pipeline/RetryHandler/RetryHandler.cs:74)
任何帮助都将不胜感激。
感谢
结果发现,要么是我的引用有问题,要么是不兼容的SimpleDB/Cognito包有问题。
我删除了所有对亚马逊的引用。更新了NuGet,然后使用NuGet命令行使用以下命令安装Cognito和SimpleDB:
安装软件包AWSSDK。认知身份安装软件包AWSSDK。SimpleDB