Část 10– prozkoumání metod podrobností a odstranění aplikace ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Autor: Rick Anderson
Otevřete ovladač Movie a prozkoumejte metodu Details
:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o požadavek GET se třemi segmenty adresy URL, Movies
kontrolerem, metodou Details
a id
hodnotou. Vzpomeňte si, že tyto segmenty jsou definovány v Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF usnadňuje vyhledávání dat pomocí FirstOrDefaultAsync
metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že vyhledávací metoda našla film předtím, než se s ní pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:{PORT}/Movies/Details/1
něco podobného http://localhost:{PORT}/Movies/Details/12345
(nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali video s hodnotou null, aplikace vyvolá výjimku.
Prozkoumejte metody Delete
a DeleteConfirmed
metody.
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Všimněte si, že HTTP GET Delete
metoda neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.
Metoda [HttpPost]
, která odstraní data, je pojmenovaná DeleteConfirmed
tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě Delete
metody – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)
Existují dva přístupy k tomuto problému, jeden je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete")
atributu do DeleteConfirmed
metody. Tento atribut provádí mapování pro směrovací systém tak, aby metoda našla DeleteConfirmed
adresu URL, která obsahuje /Delete/ pro požadavek POST.
Další běžnou prací pro metody, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval další (nepoužitý) parametr. To jsme udělali v předchozím příspěvku, když jsme přidali notUsed
parametr. Pro metodu [HttpPost] Delete
byste mohli udělat totéž:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikování do Azure
Informace o nasazení do Azure najdete v kurzu: Sestavení aplikace ASP.NET Core a SQL Database ve službě Aplikace Azure Service.
Vzory podnikových webových aplikací
Pokyny k vytvoření spolehlivé, zabezpečené, výkonné, testovatelné a škálovatelné aplikace ASP.NET Core najdete v vzorech podnikových webových aplikací. K dispozici je kompletní ukázková webová aplikace pro produkční kvalitu, která implementuje vzory.
Otevřete ovladač Movie a prozkoumejte metodu Details
:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o požadavek GET se třemi segmenty adresy URL, Movies
kontrolerem, metodou Details
a id
hodnotou. Vzpomeňte si, že tyto segmenty jsou definovány v Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF usnadňuje vyhledávání dat pomocí FirstOrDefaultAsync
metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že vyhledávací metoda našla film předtím, než se s ní pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:{PORT}/Movies/Details/1
něco podobného http://localhost:{PORT}/Movies/Details/12345
(nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali video s hodnotou null, aplikace vyvolá výjimku.
Prozkoumejte metody Delete
a DeleteConfirmed
metody.
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Všimněte si, že HTTP GET Delete
metoda neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.
Metoda [HttpPost]
, která odstraní data, je pojmenovaná DeleteConfirmed
tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě Delete
metody – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)
Existují dva přístupy k tomuto problému, jeden je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete")
atributu do DeleteConfirmed
metody. Tento atribut provádí mapování pro směrovací systém tak, aby metoda našla DeleteConfirmed
adresu URL, která obsahuje /Delete/ pro požadavek POST.
Další běžnou prací pro metody, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval další (nepoužitý) parametr. To jsme udělali v předchozím příspěvku, když jsme přidali notUsed
parametr. Pro metodu [HttpPost] Delete
byste mohli udělat totéž:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikování do Azure
Informace o nasazení do Azure najdete v kurzu: Sestavení aplikace ASP.NET Core a SQL Database ve službě Aplikace Azure Service.
Vzory podnikových webových aplikací
Pokyny k vytvoření spolehlivé, zabezpečené, výkonné, testovatelné a škálovatelné aplikace ASP.NET Core najdete v vzorech podnikových webových aplikací. K dispozici je kompletní ukázková webová aplikace pro produkční kvalitu, která implementuje vzory.
Otevřete ovladač Movie a prozkoumejte metodu Details
:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o požadavek GET se třemi segmenty adresy URL, Movies
kontrolerem, metodou Details
a id
hodnotou. Vzpomeňte si, že tyto segmenty jsou definovány v Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF usnadňuje vyhledávání dat pomocí FirstOrDefaultAsync
metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že vyhledávací metoda našla film předtím, než se s ní pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:{PORT}/Movies/Details/1
něco podobného http://localhost:{PORT}/Movies/Details/12345
(nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali video s hodnotou null, aplikace vyvolá výjimku.
Prozkoumejte metody Delete
a DeleteConfirmed
metody.
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Všimněte si, že HTTP GET Delete
metoda neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.
Metoda [HttpPost]
, která odstraní data, je pojmenovaná DeleteConfirmed
tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě Delete
metody – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)
Existují dva přístupy k tomuto problému, jeden je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete")
atributu do DeleteConfirmed
metody. Tento atribut provádí mapování pro směrovací systém tak, aby metoda našla DeleteConfirmed
adresu URL, která obsahuje /Delete/ pro požadavek POST.
Další běžnou prací pro metody, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval další (nepoužitý) parametr. To jsme udělali v předchozím příspěvku, když jsme přidali notUsed
parametr. Pro metodu [HttpPost] Delete
byste mohli udělat totéž:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikování do Azure
Informace o nasazení do Azure najdete v kurzu: Sestavení aplikace ASP.NET Core a SQL Database ve službě Aplikace Azure Service.
Otevřete ovladač Movie a prozkoumejte metodu Details
:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o požadavek GET se třemi segmenty adresy URL, Movies
kontrolerem, metodou Details
a id
hodnotou. Vzpomeňte si, že tyto segmenty jsou definovány v Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF usnadňuje vyhledávání dat pomocí FirstOrDefaultAsync
metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že vyhledávací metoda našla film předtím, než se s ní pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:{PORT}/Movies/Details/1
něco podobného http://localhost:{PORT}/Movies/Details/12345
(nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali video s hodnotou null, aplikace vyvolá výjimku.
Prozkoumejte metody Delete
a DeleteConfirmed
metody.
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
_context.Movie.Remove(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Všimněte si, že HTTP GET Delete
metoda neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.
Metoda [HttpPost]
, která odstraní data, je pojmenovaná DeleteConfirmed
tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě Delete
metody – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)
Existují dva přístupy k tomuto problému, jeden je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete")
atributu do DeleteConfirmed
metody. Tento atribut provádí mapování pro směrovací systém tak, aby metoda našla DeleteConfirmed
adresu URL, která obsahuje /Delete/ pro požadavek POST.
Další běžnou prací pro metody, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval další (nepoužitý) parametr. To jsme udělali v předchozím příspěvku, když jsme přidali notUsed
parametr. Pro metodu [HttpPost] Delete
byste mohli udělat totéž:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikování do Azure
Informace o nasazení do Azure najdete v kurzu: Sestavení aplikace ASP.NET Core a SQL Database ve službě Aplikace Azure Service.
Otevřete ovladač Movie a prozkoumejte metodu Details
:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o požadavek GET se třemi segmenty adresy URL, Movies
kontrolerem, metodou Details
a id
hodnotou. Vzpomeňte si, že tyto segmenty jsou definovány v Startup.cs
.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
EF usnadňuje vyhledávání dat pomocí FirstOrDefaultAsync
metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že vyhledávací metoda našla film předtím, než se s ní pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:{PORT}/Movies/Details/1
něco podobného http://localhost:{PORT}/Movies/Details/12345
(nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali video s hodnotou null, aplikace vyvolá výjimku.
Prozkoumejte metody Delete
a DeleteConfirmed
metody.
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
_context.Movie.Remove(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Všimněte si, že HTTP GET Delete
metoda neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.
Metoda [HttpPost]
, která odstraní data, je pojmenovaná DeleteConfirmed
tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě Delete
metody – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)
Existují dva přístupy k tomuto problému, jeden je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete")
atributu do DeleteConfirmed
metody. Tento atribut provádí mapování pro směrovací systém tak, aby metoda našla DeleteConfirmed
adresu URL, která obsahuje /Delete/ pro požadavek POST.
Další běžnou prací pro metody, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval další (nepoužitý) parametr. To jsme udělali v předchozím příspěvku, když jsme přidali notUsed
parametr. Pro metodu [HttpPost] Delete
byste mohli udělat totéž:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikování do Azure
Informace o nasazení do Azure najdete v kurzu: Sestavení aplikace ASP.NET Core a SQL Database ve službě Aplikace Azure Service.