Sdílet prostřednictvím


Čá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 ve verzi .NET 10 tohoto článku.

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.

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.