Создание пользовательского сообщения об ошибке 401 в веб-API контроллера - PullRequest
0 голосов
/ 08 января 2020

Привет, я застрял на контрольно-пропускном пункте о том, как создать собственное сообщение об ошибке 401, я читаю некоторые учебные пособия о том, как создать собственный ответ об ошибке в C#, когда я вижу некоторые из кодов наиболее из них не работают, а некоторые выглядят довольно беспорядочно ,

[Authorize]     
        [HttpGet]
        public HttpResponseMessage gethistogram(string entity_name, string kpi_name, string chart_type, int unix_start, int unix_end, string language)
        {

            var result = _definitionRepository.histogram(entity_name,kpi_name,chart_type,unix_start,unix_end,language);
            //if (result == null)
            //{
            //    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, " Entity Name? Chart Type? KPI Name?, Language? Unix Start? or Unix End?");
            //}
            //return Request.CreateResponse(HttpStatusCode.OK, result);
            if (chart_type == null)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid chart Type to access data");
            }
            if (kpi_name == null)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid KPI name to access data");
            }
            if (entity_name == null)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Entity name to access data");
            }
            if (kpi_name == null && chart_type == null && entity_name == null)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Required parameters missing to access data");
            }
            return Request.CreateResponse(HttpStatusCode.OK, result);

        }

Я хочу изменить ответ об ошибке по умолчанию с

{
    "Message": "Authorization has been denied for this request."
}

на

{
    "Message": "This request is unauthorized"
}

Вот мой репозиторий для проверки

public List<Root> histogram(string entity_name, string kpi_name , string chart_type ,int unix_start, int unix_end, string language)
{
    var all = _db
        .kpi_definition
        //.Include("KPI")
        .Where(dl => entity_name == dl.entity_name && kpi_name == dl.kpi_name && chart_type == dl.chart_type && unix_start == dl.unix_start && unix_end == dl.unix_end && language == dl.language)
        .Select(dl => new Root
        {
            chart_type = new List<Chart>
            {
               new Chart { entity_name = dl.entity_name ,
                           entity_display_name = dl.entity_display_name,
                           kpi = new List<KPI>
                           {
                              new KPI {
                                       kpi_name = dl.kpi_name,
                                       kpi_display_name = dl.kpi_display_name,
                                       required = new List<Required>
                                       {
                                           new Required
                                           {
                                               //kpi_required = dl.kpi_required
                                           }
                                       },
                                       optional = new List<Optional>
                                       {
                                           new Optional
                                           {
                                               //kpi_optional = dl.kpi_optional
                                           }
                                       },
                                       objects = new List<Objects>
                                       {
                                           new Objects
                                           {
                                               field_name = new List<FieldName>
                                               {
                                                   new FieldName
                                                   {
                                                    entity_display_name = dl.entity_display_name,
                                                    type = "Select or Text",
                                                    @default = "default value(already selected)",
                                                    list = "",
                                                    ID = dl.ID
                                                   }
                                               }

                                           }
                                       }
                                      }
                           }
                         }
            }
        }).ToList();
    return all;
}

1 Ответ

1 голос
/ 08 января 2020

Я думаю, вы можете создать собственный фильтр авторизации, который устанавливает ответ 401 вместе с пользовательским сообщением. Вот ссылка « Как вернуть пользовательское сообщение, если авторизация не удалась в WebAPI », чего, я считаю, вы добиваетесь. Итак, вкратце, нам нужно создать класс, скажем, CustomAuthorize, наследующий AuthorizeAttribute

public class CustomAuthorize : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(HttpActionContext 
       actionContext)
    {
        actionContext.Response = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.Forbidden,
            Content = new StringContent("This request is unauthorized")
        };
    }
}

Затем мы можем использовать этот атрибут вместо фильтра Authorize поверх метода gethistogram, такого как

    [CustomAuthorize]     
    [HttpGet]
    public HttpResponseMessage gethistogram(string entity_name, 
        string kpi_name, string chart_type, int unix_start, int 
        unix_end, string language)
    {

        var result = _definitionRepository.histogram(entity_name,kpi_name,chart_type,unix_start,unix_end,language);
        //if (result == null)
        //{
        //    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, " Entity Name? Chart Type? KPI Name?, Language? Unix Start? or Unix End?");
        //}
        //return Request.CreateResponse(HttpStatusCode.OK, result);
        if (chart_type == null)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid chart Type to access data");
        }
        if (kpi_name == null)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid KPI name to access data");
        }
        if (entity_name == null)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Entity name to access data");
        }
        if (kpi_name == null && chart_type == null && entity_name == null)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Required parameters missing to access data");
        }
        return Request.CreateResponse(HttpStatusCode.OK, result);

    }
...