Część 10. Badanie metod Szczegółów i Usuwanie aplikacji ASP.NET Core

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Autor: Rick Anderson

Otwórz kontroler Movie i sprawdź metodę 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);
}

Aparat tworzenia szkieletów MVC, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies kontrolerem, Details metodą i wartością id . Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs.

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1 na coś http://localhost:{PORT}/Movies/Details/12345 podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.

Zbadaj Delete metody i DeleteConfirmed .

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

Należy pamiętać, że HTTP GET Delete metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.

Metoda [HttpPost] , która usuwa dane, jest nazwana DeleteConfirmed w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa 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)
{

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).

Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")DeleteConfirmed do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed .

Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed . Możesz to zrobić w tym miejscu dla [HttpPost] Delete metody :

// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

Publikowanie na platformie Azure

Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.

Niezawodne wzorce aplikacji internetowej

Aby uzyskać wskazówki dotyczące tworzenia nowoczesnej, niezawodnej, wydajnej, wydajnej, ekonomicznej i skalowalnej aplikacji ASP.NET Core, od podstaw lub refaktoryzacji istniejącej aplikacji, zobacz Niezawodny wzorzecaplikacji internetowej for.NET YouTube.

Otwórz kontroler Movie i sprawdź metodę 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);
}

Aparat tworzenia szkieletów MVC, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies kontrolerem, Details metodą i wartością id . Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs.

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1 na coś http://localhost:{PORT}/Movies/Details/12345 podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.

Zbadaj Delete metody i DeleteConfirmed .

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

Należy pamiętać, że HTTP GET Delete metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.

Metoda [HttpPost] , która usuwa dane, jest nazwana DeleteConfirmed w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa 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)
{

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).

Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")DeleteConfirmed do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed .

Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed . Możesz to zrobić w tym miejscu dla [HttpPost] Delete metody :

// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

Publikowanie na platformie Azure

Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.

Otwórz kontroler Movie i sprawdź metodę 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);
}

Aparat tworzenia szkieletów MVC, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies kontrolerem, Details metodą i wartością id . Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs.

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1 na coś http://localhost:{PORT}/Movies/Details/12345 podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.

Zbadaj Delete metody i DeleteConfirmed .

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

Należy pamiętać, że HTTP GET Delete metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.

Metoda [HttpPost] , która usuwa dane, jest nazwana DeleteConfirmed w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa 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)
{

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).

Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")DeleteConfirmed do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed .

Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed . Możesz to zrobić w tym miejscu dla [HttpPost] Delete metody :

// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

Publikowanie na platformie Azure

Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.

Otwórz kontroler Movie i sprawdź metodę 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);
}

Aparat tworzenia szkieletów MVC, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies kontrolerem, Details metodą i wartością id . Pamiętaj, że te segmenty są zdefiniowane w pliku Startup.cs.

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1 na coś http://localhost:{PORT}/Movies/Details/12345 podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.

Zbadaj Delete metody i DeleteConfirmed .

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

Należy pamiętać, że HTTP GET Delete metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.

Metoda [HttpPost] , która usuwa dane, jest nazwana DeleteConfirmed w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa 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)
{

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).

Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")DeleteConfirmed do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed .

Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed . Możesz to zrobić w tym miejscu dla [HttpPost] Delete metody :

// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

Publikowanie na platformie Azure

Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.