» »

ASP .NET Middleware

ASP .NET Middleware

acookook ::

V solutionu imam 2 projekta.
1. Web ui za vnašanje podatkov
2. Core Logic, kjer kličem providerjev REST API.
Cilj je izdelat nek robust exception handling sistem, kjer bom lahko v Core Logicu throwal exception-u ter ga polovil v middlewareu.
Stanje je trenutno tako:
...
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Text.Json;

namespace ...;

public class GlobalErrorHandlingMiddleWare : IMiddleware
{
   private readonly ILogger<GlobalErrorHandlingMiddleWare> _logger;

   public GlobalErrorHandlingMiddleWare(ILogger<GlobalErrorHandlingMiddleWare> logger) => _logger = logger;

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, ex.Message);

            ProblemDetails problemDetails = new();

            problemDetails = ex.GetType().Name switch
            {
                //400
                nameof(BadRequestException) => ((BadRequestException)ex).GetProblemDetails(),
                _ => new()
                {
                   ....
                },
            };
#if DEBUG
            problemDetails.Detail = $"{problemDetails.Detail} Stack trace: {ex.StackTrace}";
#endif
            var json = JsonSerializer.Serialize(problemDetails);
            context.Response.StatusCode = problemDetails.Status.Value;
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync(json);
        }
        throw new NotImplementedException();
    }
}

Definicije custom classov so naslednje:
public class BaseCustomException : Exception
{
    public string MessageDescription { get; }
    public BaseCustomException(string message, string messageDescription) : base(message)
    {
        MessageDescription = messageDescription;
    }
    public virtual ProblemDetails GetProblemDetails(HttpStatusCode statusCode, string problemType)
    {
        return new ProblemDetails()
        {
            Status = (int)statusCode,
            Type = problemType,
            Title = Message,
            Detail = MessageDescription
        };
    }
}
public class BadRequestException : BaseCustomException
{
    public BadRequestException(string message, string messageDescription)
        : base(message, messageDescription) { }
    public ProblemDetails GetProblemDetails()
    {
        return GetProblemDetails(HttpStatusCode.BadRequest, "Bad request");
    }
}

V Program.cs kličem servis kot Transient. Kam točno ter par fileov spraviti, da bom zadeve pravilno hendlal. Če kličem recimo iz web projekta, potem definitivno dobim krožno referenco, sicer pa nisem šur, da lahko namespace iz web-a kličem v Core Logic.
.

acookook ::

Celotna želja sčistiti tale mess,
 $.ajax({
        url: 'testUrl',
        type: 'POST',
        processData: false,
        cache: false,
        data: populateFormData(data),
        contentType: false,
        success: function (result) {
            let messageTitle = result["messageTitle"];
            let message = result["message"];

            if (result["statusCode"] === 206) {
                appendWarning(messageTitle, message);

                return;
            }

            appendSuccess(messageTitle, message);

            $('select').selectpicker('refresh');
            $('form')[0].reset();
        },
        error: function (data) {

            let errorCode = data['status'];

            if (data['status'] == 413) {
                appendAlert("Upload limit exceeded!", "Please provide a smaller number of files with a smaller data size.");
                return;
            }
            if (data['status'] == 500) {
                appendAlert("Generic server error!", "Generic server error.");
                return;
            }
            let rawData = JSON.parse(data.responseText);
            appendAlert(rawData.messageTitle, rawData.message);
        }
    });

Mogoče pa še dva dodatna cilja:
1. Vpeljati eno splošno ajax metodo.
2. Vpeljati
done()
in
fail()
namesto
.success:
in
.error:
.

FireSnake ::

Zadeva niti ni preveč komplicirana, zgolj zaradi berljivosti bi refakturiral?

V ProblemDetails, kjer v int parsaš statusCode:
- je statusCode zagotovo vedno številka?
- če ni, bo na tem mestu crknilo
- jaz bi uporabil Int32.TryParse

Prav tako bi si vse stringe spravil v polje ali enum in pouporabil.
Poglej in se nasmej: vicmaher.si

Zgodovina sprememb…

acookook ::

Ne, pač res ne vem kako bi stvar naredil "pravilno" na clean način in brez krožnih referenc in urediti ta mess od ajax-a.
Drugače glede ProblemDetails.
- statusCode je del System.Net.Primitives (ja lahko bi uporabljal kaj novejšega) in so vsi enumi v bistvu konstante za tiste tudi malo bolj obskurne statuse.
- verjetno bi bila boljša rešitev da naredim kar Type enum to string in bi to bilo kar ok
Ampak pravim, še vedno se mi ravno ne sanja, kako to zadevo preurediti, da bo arhitekturno gledano pravilna. Sem pogledal en Nest.js projekt, ki smo ga na podoben način naredili. Tam sicer nisem delal ločen projekt za core logic in repositoryje, ampak smo jih dali samo v ločene datoteke, no še vedno smo se držali konvencije.
.

Zgodovina sprememb…

  • spremenil: acookook ()

acookook ::

Moti me tudi, da mi javi tole:
.

gaoZjQP ::

lahko si narediš nek univerzalen framework, ki je bližji tvojim željam/zahtevam in v jedru mapira in kliče karkoli že pač je potrebno, da stvar dela.

acookook ::

O tem razmišljam, ja...ampak najprej moram itak skodirat neko osnovo, ki bo preverjeno delovala v projektu, kjer bo prvič uvedena.
.

FireSnake ::

acookook je izjavil:

O tem razmišljam, ja...ampak najprej moram itak skodirat neko osnovo, ki bo preverjeno delovala v projektu, kjer bo prvič uvedena.


Hočeš povedati, da ta koda sploh ne dela?
Bolje rečeno: ne dela na tvojem projektu?
Poglej in se nasmej: vicmaher.si

Zgodovina sprememb…

acookook ::

Kot "preverjeno dela", da je, ja 1. delujoča v smislu želja iz prvega topica in da je arhitekturno gledano kul. Najbolj si nisem glede overridea ziher.
.

FireSnake ::

Oprosti, jaz ne razumem več nič kar želiš povedati.
Poglej in se nasmej: vicmaher.si


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Entity framework 6 database first

Oddelek: Programiranje
361577 (486) acookook
»

Davčne blagajne (strani: 1 2 3 424 25 26 27 )

Oddelek: Programiranje
1344332533 (72536) Macketina
»

Pomoč pri kontakt formi

Oddelek: Izdelava spletišč
518497 (18395) Vzdevek
»

android črta

Oddelek: Programiranje
412399 (1670) g333kk
»

python -slovar

Oddelek: Programiranje
223123 (2102) Valex86

Več podobnih tem