首页 > 解决方案 > 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.

标签: asp.netentity-frameworkasp.net-core

解决方案


如果你想像 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);
}

推荐阅读