asp.net - Getting internal server error (500) in response after insert/update
问题描述
CRUD operation works fine with the database but i am getting 500 internal server error for POST/PUT operation. I am getting 200 for GET/DELETE.
I worked with crud operation in ASP.NET and my code is running in prod. I have a requirement to migrate that to .NET Core. While testing i found that CRUD operations are working fine and i can see the changes related to data inside the SQL database but for Insert/Update, I am getting 500 error in response.
Code for .NET Framework (Working):-
public class ActivityUpdatesController : ApiController
{
private PortfolioMgmtEntities db = new PortfolioMgmtEntities();
// GET: api/ActivityUpdates
public IQueryable<ActivityUpdate> GetActivityUpdates()
{
return db.ActivityUpdates;
}
[Route("api/activityUpdates/getByProjectId")]
public IQueryable<ActivityUpdate> getActivityUpdatesByProjectId(int projectId)
{
IQueryable<ActivityUpdate> activityUpdates = from r in db.ActivityUpdates
where r.ProjectID == projectId
select r;
return activityUpdates;
}
// GET: api/ActivityUpdates/5
[ResponseType(typeof(ActivityUpdate))]
public IHttpActionResult GetActivityUpdate(int id)
{
ActivityUpdate activityUpdate = db.ActivityUpdates.Find(id);
if (activityUpdate == null)
{
return NotFound();
}
return Ok(activityUpdate);
}
// PUT: api/ActivityUpdates/5
[ResponseType(typeof(void))]
public IHttpActionResult PutActivityUpdate(int id, ActivityUpdate activityUpdate)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != activityUpdate.RecordID)
{
return BadRequest();
}
db.Entry(activityUpdate).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!ActivityUpdateExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/ActivityUpdates
[ResponseType(typeof(ActivityUpdate))]
[Route("api/activityUpdates/create")]
public IHttpActionResult PostActivityUpdate(int projectId, [FromBody] ActivityUpdate activityUpdate)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
activityUpdate.ProjectID = projectId;
activityUpdate.UpdatedDate = DateTime.Now;
db.ActivityUpdates.Add(activityUpdate);
db.SaveChanges();
IQueryable<ActivityUpdate> activityUpdates = from au in db.ActivityUpdates
where au.ProjectID == projectId
select au;
return CreatedAtRoute("DefaultApi", new { controller = "ActivityUpdates" }, activityUpdates);
}
// DELETE: api/ActivityUpdates/5
[ResponseType(typeof(ActivityUpdate))]
public IHttpActionResult DeleteActivityUpdate(int id)
{
ActivityUpdate activityUpdate = db.ActivityUpdates.Find(id);
if (activityUpdate == null)
{
return NotFound();
}
db.ActivityUpdates.Remove(activityUpdate);
db.SaveChanges();
return Ok(activityUpdate);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool ActivityUpdateExists(int id)
{
return db.ActivityUpdates.Count(e => e.RecordID == id) > 0;
}
}
WebAPiConfig.cs
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableCors(new EnableCorsAttribute("*", "*", "GET,PUT,POST,DELETE"));
}
Code for .NET Core (Not Working):-
public class ActivityUpdatesController : Controller
{
private aeportfoliomgmtdbContext db = new aeportfoliomgmtdbContext();
// GET: api/ActivityUpdates
public IQueryable<ActivityUpdates> GetActivityUpdates()
{
return db.ActivityUpdates;
}
[HttpGet]
[Route("api/activityUpdates/getByProjectId")]
public IQueryable<ActivityUpdates> getActivityUpdatesByProjectId(int projectId)
{
IQueryable<ActivityUpdates> activityUpdates = from r in db.ActivityUpdates
where r.ProjectId == projectId
select r;
return activityUpdates;
}
[HttpPost]
[Route("api/activityUpdates/create")]
public IActionResult PostActivityUpdate(int projectId, [FromBody] ActivityUpdates activityUpdate)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
activityUpdate.ProjectId = projectId;
activityUpdate.UpdatedDate = DateTime.Now;
db.ActivityUpdates.Add(activityUpdate);
db.SaveChanges();
IQueryable<ActivityUpdates> activityUpdates = from au in db.ActivityUpdates
where au.ProjectId == projectId
select au;
return CreatedAtRoute("DefaultApi", new { controller = "ActivityUpdates" }, activityUpdates);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool ActivityUpdateExists(int id)
{
return db.ActivityUpdates.Count(e => e.RecordId == id) > 0;
}
}
startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseCors("CorsPolicy");
app.UseMvc(routes =>
{
routes.MapRoute(
name: "DefaultApi",
template: "api/{controller}/{id}");
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
}
I am unable to find where is the mistake. Could you please help me to solve this issue? Any help will be appreciated.
解决方案
如果你想像 web api 一样返回GetActivityUpdates
,尝试在GetActivityUpdates
方法上方定义路由名称。
[HttpGet("api/activityUpdates/GetActivityUpdates", Name = "GetActivityUpdates")]
public IQueryable<ActivityUpdates> GetActivityUpdates()
{
return db.ActivityUpdates;
}
[HttpGet]
[Route("api/activityUpdates/getByProjectId")]
public IQueryable<ActivityUpdates> getActivityUpdatesByProjectId(int projectId)
{
IQueryable<ActivityUpdates> activityUpdates = from r in db.ActivityUpdates
where r.ProjectId == projectId
select r;
return activityUpdates;
}
[HttpPost]
[Route("api/activityUpdates/create")]
public IActionResult PostActivityUpdate(int projectId, [FromBody] ActivityUpdates activityUpdate)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
activityUpdate.ProjectId = projectId;
activityUpdate.UpdatedDate = DateTime.Now;
db.ActivityUpdates.Add(activityUpdate);
db.SaveChanges();
IQueryable<ActivityUpdates> activityUpdates = from au in db.ActivityUpdates
where au.ProjectId == projectId
select au;
return CreatedAtRoute("GetActivityUpdates", activityUpdates);
}
推荐阅读
- javascript - Puppeteer 链接 ( ) 未从 html 转换为 pdf
- android - 如何设置依赖于来自另一个模块的元素的依赖项
- python - 动画没有在正确的时间出现
- php - PHP Paypal IPN 方法 - 沙盒测试登录详情
- php - Twilio 创建 1:many 关系,以便单个号码到达 2+ 个组织
- linkedhashmap - 我正在尝试为以下 json 定义一个 raml 规范:an arrayList of LinkedHashMap
- android - Android JVM 11 语言支持
- html - 在 Flask 中以相同的 id 从 MySQL 打印数据
- akka - 将 prefixAndTail(1) 与 Sink.lazySink 组合用于由 .splitAfter 创建的 SubFlow
- javascript - 输入值首先返回空并重复字母