Forum » Programiranje » 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:
Definicije custom classov so naslednje:
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.
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,
Mogoče pa še dva dodatna cilja:
1. Vpeljati eno splošno ajax metodo.
2. Vpeljati
$.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.
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…
- spremenilo: FireSnake ()
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.
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 ()
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 ::
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…
- spremenilo: FireSnake ()
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.
.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Entity framework 6 database firstOddelek: Programiranje | 1567 (476) | acookook |
» | Davčne blagajne (strani: 1 2 3 4 … 24 25 26 27 )Oddelek: Programiranje | 331391 (71394) | Macketina |
» | Pomoč pri kontakt formiOddelek: Izdelava spletišč | 18486 (18384) | Vzdevek |
» | android črtaOddelek: Programiranje | 2389 (1660) | g333kk |
» | python -slovarOddelek: Programiranje | 3112 (2091) | Valex86 |