【发布时间】:2019-06-07 23:05:01
【问题描述】:
我是 .NET Core、Entity Framework、AWS 以及这里几乎所有内容的新手(如果需要在帖子中添加任何内容,请发表评论并告诉我)。
我正在尝试使用 AWS Lambda 部署 .NET Core Web API。我的 API 似乎在本地工作,因为我对其进行了测试(我有一个 Angular 前端应用程序,通过它我能够成功执行所有 API)。但是,当我使用 AWS 部署并在 Postman 上运行一些 API 时,我收到“502 Bad Gateway”错误。
我的serverless.yml 文件如下所示:
service: angularawardwebapi
provider:
name: aws
runtime: dotnetcore2.1
region: us-east-1
package:
artifact: bin/release/netcoreapp2.1/deploy-package.zip
functions:
api:
handler: angularawardwebapi::angularawardwebapi.LambdaEntryPoint::FunctionHandlerAsync
events:
- http:
path: /{proxy+}
method: ANY
我的模型类看起来像这样:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace angularawardwebapi.Models {
public class Student {
[Key]
public int StudentId{get;set;}
[Required]
[Column(TypeName="nvarchar(50)")]
public string StudentFirstName{get;set;}
[Required]
[Column(TypeName="varchar(50)")]
public string StudentLastName{get;set;}
}
}
我的 DbContext 文件如下所示:
public class DatabaseContext:DbContext {
public DatabaseContext(DbContextOptions<DatabaseContext> options):base(options) {
}
public DbSet<Student> Students {get;set;}
}
}
我的控制器中有两个方法:
[HttpGet("temp")]
public ActionResult<List<String>> GetTemp() {
return Ok("here");
}
[HttpGet]
public ActionResult<IEnumerable<Student>> GetStudent()
{
return Ok(_context.Students);
}
第一个可以顺利运行(如预期的那样)。但是,当我尝试返回数据库中的学生列表时,我似乎遇到了问题。
我也尝试在本地使用第二个 API,并收到了适当的响应:
[
{
"StudentId": 1,
"StudentFirstName": "John",
"StudentLastName": "Doe"
}
]
我还检查了 AWS CloudWatch 日志,显示如下:
[Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request starting GET https://[myurl]/dev/api/Student/
[Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Route matched with {action = "GetStudent", controller = "Student"}. Executing action WebApi.Controllers.StudentController.GetStudent ([myprojectname])
[Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Executing action method WebApi.Controllers.StudentController.GetStudent ([myprojectname]) - Validation state: Valid
[Information] Microsoft.EntityFrameworkCore.Infrastructure: Entity Framework Core 2.1.8-servicing-32085 initialized 'DatabaseContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
END RequestId: f57417d3-4075-4680-a78d-e90e2c710760
REPORT RequestId: f57417d3-4075-4680-a78d-e90e2c710760 Duration: 6006.80 ms Billed Duration: 6000 ms Memory Size: 1024 MB Max Memory Used: 141 MB
2019-06-06T14:19:41.116Z f57417d3-4075-4680-a78d-e90e2c710760 Task timed out after 6.01 seconds
当我在本地运行 API 时,不会出现此超时问题,因为我会立即得到正确的响应(如上所述)。
更新
所以我现在有了一个 RDS 数据库,我可以成功地连接到它并在 SSMS 中使用它。在本地运行 API 也仍然有效。但是,在我使用serverless deploy -v 部署它之后,我仍然面临上一个问题。正如建议的那样,我尝试修改数据库的权限,尽管我也不确定我在那里做的事情是正确的。我所做的是:
- 进入 SSMS 并修改数据库权限,方法是右键单击服务器,转到权限,选择我的登录名(我在配置 RDS 时设置的),并授予“更改任何数据库”选项。然后我进入数据库本身并修改了一些权限(删除、插入和更新)。
- 我还启用了 Windows Management Instrumentation (WMI-In) Windows 防火墙规则。
这些似乎都没有解决我的问题。
【问题讨论】:
-
生产数据库和本地数据库中有多少学生?
-
现在,我同时使用本地数据库。
-
是什么让我想到了这个问题:数据库似乎并非完全无法访问,否则错误会有所不同。像数据库一样超时气味需要太多时间来传输结果 - 例如,如果您有大量的点击量,就会出现这种情况。你如何托管你的数据库?在 AWS 上还是在完全不同的地方?
-
谢谢!我想我必须首先使用 Elastic Beanstalk 设置我的数据库实例和所有内容,对吗?然后按照我设置本地数据库的相同步骤进行操作。
-
@Fildor 感谢您之前的帮助。我仍然遇到这个问题,但原因似乎不同。根据我在下面与 carlos chourio 的对话,我现在创建了一个 RDS 数据库并更新了我的 .NET 代码以连接到它。但是,我仍然遇到超时问题。
标签: c# entity-framework aws-lambda asp.net-core-webapi rds