ASP.NET MVC отлично работает на локальном компьютере, но после развертывания в Службе приложений Azure страницы, связанные с операцией записи в базе данных, не отображаются (страницы, которые добавляют данные в базу данных, и страницы, которые обновляют данные в базе данных).
Вот пример кода одного контроллера, который вставляет данные:
public ActionResult Create()
{
ViewBag.nbEnt = db.Entrepots.Where(e => e.active == true).Count();
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,entrName,entrAdres,LocaliteId,entrFreePlace,entrBusyPlace,entrTotalPlace,active")] Entrepot entrepot)
{
if (ModelState.IsValid)
{
entrepot.active = true;
db.Entrepots.Add(entrepot);
db.SaveChanges();
TempData["action"] = "add";
return RedirectToAction("Index");
}
ViewBag.LocaliteId = new SelectList(db.Localites, "Id", "locTown", entrepot.LocaliteId);
return View(entrepot);
}
Вот пример обновления:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Entrepot entrepot = db.Entrepots.Find(id);
if (entrepot == null)
{
return HttpNotFound();
}
return View(entrepot);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,entrName,entrAdres,LocaliteId,entrFreePlace,entrBusyPlace,entrTotalPlace,active")] Entrepot entrepot)
{
if (ModelState.IsValid)
{
db.Entry(entrepot).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.LocaliteId = new SelectList(db.Localites, "Id", "locTown", entrepot.LocaliteId);
return View(entrepot);
}
Любая подсказка или совет по этому поводу?
Спасибо.
Я пробовал отладчик, связанный с Visual Studio, но это мне не помогло.
@Kris_belgium У вас возникает какая-либо ошибка? если да, можете ли вы поделиться ошибкой.
@Kris_belgium Вы развернули свой сервер Sql на сервере Azure Sql?
@Kris_belgium Проверьте журналы службы приложений и строку подключения.
@AsleshaKantamsetti да, я развернул его, и отображались только те страницы, где не было UPDATE или INSERT в БД (страницы SELECT были в порядке)
Я попробовал простой ASP. NET MVC Framework 4.8 с SQL Server и развернул его в Azure.
Убедитесь, что схема базы данных правильно перенесена при развертывании в Azure. Если вы используете миграцию Entity Framework Code First, убедитесь, что ваши миграции правильно применяются к базе данных SQL Azure.
Убедитесь, что ваша база данных SQL Azure правильно настроена и доступна из службы приложений Azure.
Это мой контроллер, используемый для создания и обновления данных в моей базе данных.
Контроллер Entrepots:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using WebApplication4.Models;
namespace WebApplication4.Controllers
{
public class EntrepotsController : Controller
{
private EntrepotDbContext db = new EntrepotDbContext();
public ActionResult Index()
{
return View(db.Entrepots.ToList());
}
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Entrepot entrepot = db.Entrepots.Find(id);
if (entrepot == null)
{
return HttpNotFound();
}
return View(entrepot);
}
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,entrName,entrAdres,LocaliteId,active")] Entrepot entrepot)
{
if (ModelState.IsValid)
{
db.Entrepots.Add(entrepot);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(entrepot);
}
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Entrepot entrepot = db.Entrepots.Find(id);
if (entrepot == null)
{
return HttpNotFound();
}
return View(entrepot);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,entrName,entrAdres,LocaliteId,active")] Entrepot entrepot)
{
if (ModelState.IsValid)
{
db.Entry(entrepot).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(entrepot);
}
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Entrepot entrepot = db.Entrepots.Find(id);
if (entrepot == null)
{
return HttpNotFound();
}
return View(entrepot);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Entrepot entrepot = db.Entrepots.Find(id);
db.Entrepots.Remove(entrepot);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}
Ниже приведена строка подключения к Azure SQL Server.
Веб.Конфигурация:
<connectionStrings>
<add name = "ConnectionString" connectionString = "Server=tcp:<ServerName>.database.windows.net,1433;Initial Catalog=<DataBaseName>;Persist Security Info=False;User ID=<UserName>;Password=<Password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName = "System.Data.SqlClient" />
</connectionStrings>
Локальный выход:
Если перед развертыванием веб-приложения в Azure вы создаете миграции с использованием строки ConnectionString локальной базы данных SQL, удалите эти миграции и создайте новые миграции с помощью ConnectionString базы данных SQL Azure.
Вывод службы приложений Azure:
Ниже приведены результаты моей базы данных Azure Sql:
Мне удалось решить проблему, удалив из просмотра токен защиты от подделки.
@Html.AntiForgeryToken()
а также удалил его из контроллера:
[HttpPost]
// [ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,entrName,entrAdres,LocaliteId,entrFreePlace,entrBusyPlace,entrTotalPlace,active")] Entrepot entrepot)
{
if (ModelState.IsValid)...
теперь код работает нормально, спасибо всем вам за помощь и поддержку, которые помогли мне протестировать мой код вашими советами.
Удалось ли вам получить сообщение об ошибке?