Получение внутренней ошибки сервера (500) в ответе после вставки / обновления - PullRequest
0 голосов
/ 01 февраля 2019

Операция CRUD отлично работает с базой данных, но я получаю 500 внутренних ошибок сервера для операции POST / PUT.Я получаю 200 за GET / DELETE.

Я работал с crud в ASP.NET, и мой код работает в prod.У меня есть требование перенести это на .NET Core.Во время тестирования я обнаружил, что операции CRUD работают нормально, и я могу видеть изменения, связанные с данными в базе данных SQL, но для вставки / обновления я получаю в ответ 500 ошибок.

Код для .NET Framework (Работающий): -

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"));
    }

Код для ядра .NET (не работает): -

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");
            }
        });
    }
}

Я не могу найти, где ошибка.Не могли бы вы помочь мне решить эту проблему?Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Если вы хотите вернуть GetActivityUpdates как web-интерфейс, попробуйте определить имя маршрута выше 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);
}
0 голосов
/ 01 февраля 2019

Пожалуйста, попробуйте вернуть Ok () из вашего метода сообщения не созданный маршрут и проверьте, работает он или нет.Если это работа, то, возможно, вы не определяете маршрут, который используете в созданном маршруте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...