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 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

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

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.

Spolehlivé vzory webových aplikací

Pokyny k vytvoření moderní, spolehlivé, výkonné, testovatelné, nákladově efektivní a škálovatelné aplikace ASP.NET Core, ať už od začátku nebo refaktoring existující aplikace, najdete v článku o modelu Reliable Web App Pattern for.NET YouTube.

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.

Spolehlivé vzory webových aplikací

Pokyny k vytvoření moderní, spolehlivé, výkonné, testovatelné, nákladově efektivní a škálovatelné aplikace ASP.NET Core, ať už od začátku nebo refaktoring existující aplikace, najdete v článku o modelu Reliable Web App Pattern for.NET YouTube.

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.