ExceptionMiddleware

Bu Dökümantasyon da WepAPI returnlerinin Startup clasına eklenecek olan bir Middleware ile yönetilmesi anlatılmıştır.

Extensions folderının içeirine aşağıdaki classlar açılır

Claslaın içleri şu şekildedir.

// DtResponse

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BSS_B2B_API.Extensions.ResponseModel
{
    public class DtResponse<T>
    {
        public bool IsSuccess { get; set; } = true;
        public string Message { get; set; }
        public T Data { get; set; }

    }
}

// DtResponseList

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BSS_B2B_API.Extensions.ResponseModel
{
    public class DtResponseList<T>
    {
        public bool IsSuccess { get; set; } = true;
        public string Message { get; set; }
        public List<T> Data { get; set; }
    }
}


//ErorDetails
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BSS_B2B_API.Extensions
{
    public class ErorDetails
    {
        public bool IsSuccess { get; set; }
        public string Message { get; set; }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }
}


//ExceptionMiddleware

using BSS_B2B_API.Extensions.ResponseModel;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

namespace BSS_B2B_API.Extensions
{
    public class ExceptionMiddleware
    {
        private RequestDelegate _next;

        public ExceptionMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {
            DtResponseList<object> result = new();
            try
            {
                await _next(httpContext);
            }
            catch (Exception e)
            {
                await HandleExceptionAsync(httpContext, e);
            }
        }

        private Task HandleExceptionAsync(HttpContext httpContext, Exception e)
        {
            httpContext.Response.ContentType = "application/json";
            httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            //httpContext.Response.StatusCode = (int)HttpStatusCode.OK;

            string message = e.Message;

            return httpContext.Response.WriteAsync(new ErorDetails
            {
                IsSuccess = false,
                Message = message
            }.ToString());
        }




    }
}


//ExceptionMiddlewareExtensions

using Microsoft.AspNetCore.Builder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BSS_B2B_API.Extensions
{
    public static class ExceptionMiddlewareExtensions
    {

        public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
        {
            app.UseMiddleware<ExceptionMiddleware>();
        }

    }
}

Startup içerisine aşağıdaki kod yazılır

app.ConfigureCustomExceptionMiddleware();

Yukarıda işlemlerden sonra Controller lar yazılır

örnek olarak 2 tane controller fotoğrafı eklenmiştir.

// TEK BİR DATA DÖNDÜRMAK İÇİN
         [HttpGet("ProfilPageNew")]
        public async Task<IActionResult> ProfilPageNew()
        {
            //var firmId = _httpContextAccessor.HttpContext.User.Claims.FirstOrDefault(x => x.Type == "FirmaID").Value;
            var firmId = 27576;

            DtResponse<object> result = new();

            using var connection = new SqlConnection("Data Source=185.122.203.104,1433;Database=DursunBatiDB; Integrated Security=false; User Id=Maliyet; Password=BssYazilim**2020");

            var firmaTemel = await connection.QueryFirstAsync<Company>($@"exec spB2B_ProfilBilgileri @firmaID={firmId}");

            var firmaAdress = await connection.QueryAsync<string>($@"exec spB2B_ProfilAdresler @firmaID={firmId}");

            result.Data = new { firmaTemel = firmaTemel, firmaAdres = firmaAdress };

            return Ok(result);
        }
        
        // LİST DÖNDÜRMAK İÇİN
          [HttpPost("TeklifTalepListesi")]
        public async Task<IActionResult> TeklifTalepListesi(TeklifTalepViewModel model)
        {
            //var firmId = _httpContextAccessor.HttpContext.User.Claims.FirstOrDefault(x => x.Type == "FirmaID").Value;
            DtResponseList<TeklifTalep> result = new();            
            var firmId = 27575;

            using var connection = new SqlConnection("Data Source=185.122.203.104,1433;Database=DursunBatiDB; Integrated Security=false; User Id=Maliyet; Password=BssYazilim**2020");

            var teklifTalepList = await connection.QueryAsync<TeklifTalep>($@"exec spB2B_TeklifTalepler
                                                                         @firmaID={firmId}
	                                                                    ,@TalepTarihiBaslangic='{model.TalepTarihiBaslangic.ToString("yyy-MM-dd")}'
	                                                                    ,@TalepTarihiBitis ='{model.TalepTarihiBitis.ToString("yyy-MM-dd")}'
	                                                                    ,@TerminTarihiBaslangic ='{model.TerminTarihiBaslangic.ToString("yyy-MM-dd")}'
	                                                                    ,@TerminTarihiBitis ='{model.TerminTarihiBitis.ToString("yyy-MM-dd")}'
	                                                                    ,@TeklifGrupNo ='{model.TeklifGrupNo}'
	                                                                    ,@TalepDurum ={model.TalepDurum}");

            result.Data = teklifTalepList.ToList();
            return Ok(result);
        }

Burada yapılan işlem özet olarak şu şekildedir.

Erorr işlemi ExceptionMiddleware içerisinde yönetilecektir. WepAPI success geldiğinde ise controller içerisinde istenilen model ile döndürülülecektir. Biz burada liste ve obje olarak 2 türde veri döndürdüğümüz için 2 model oluşturduk.

Last updated