ASP NET Boilerplate › Создание клиента C# swagger с помощью инструмента swagger codegen (nswag) не работает

Я попытался сгенерировать код C# и API, созданный с помощью ASP Net Boilerplate, но ответ не десериализуется правильно.

После расследования кажется, что ответ json упакован с использованием класса под названием «AjaxResponse»; однако swagger.json не включает этот тип в ответ метода.

Кто-нибудь знает, как создать клиент С# Swagger, который учитывает завернутый результат?


person Matt    schedule 20.08.2017    source источник


Ответы (3)


Aspnet Boilerplate упаковывает реальный результат в AjaxResponse. Класс AjaxResponse является классом универсального типа. Инструменту Swaggergen не удается создать правильные прокси-классы, поскольку обертывание результата происходит во время выполнения. Таким образом, сигнатура API, полученная Swagger, является необработанным результатом (не упакованным).

Таким образом, единственным решением является отключение автоматической оболочки для всего решения. Добавьте 2 строки в метод PreInitialize() в вашем проекте Web.Core. И ваша проблема будет решена.

Configuration.Modules.AbpAspNetCore().DefaultWrapResultAttribute.WrapOnError = false;

Configuration.Modules.AbpAspNetCore().DefaultWrapResultAttribute.WrapOnSuccess = false;
person Alper Ebicoglu    schedule 21.08.2017

Вы также можете использовать атрибуты [DontWrapResult]/[WrapResult] для отдельных методов приложения.

[WrapResult(LogError =false, WrapOnSuccess = true, WrapOnError = true)]
SomeApplicationServiceMethod()

[DontWrapResult(LogError =false, WrapOnError=false ,WrapOnSuccess=false)]
SomeApplicationServiceMethod()

Если вы не можете этого сделать, вы можете внести такие же изменения на стороне клиента:

Добавьте следующий класс:

 public class RequestResultAJAX<T>
    {
        public bool success { get; set; }
        public T result { get; set; }
        public string error { get; set; }
        public string targetUrl { get; set; }
        public string unAuthorizedRequest { get; set; }
        public string __abp { get; set; }
    }

Замените все точки десериализации в сгенерированном клиентском методе:

result_ = Newtonsoft.Json.JsonConvert.DeserializeObject<Dto>(responseData_, _settings.Value);

by

result_ = Newtonsoft.Json.JsonConvert.DeserializeObject<RequestResultAJAX<Dto>>(responseData_, _settings.Value).result;

И добавьте проверку успеха/ошибки перед возвратом результата.

person user2637685    schedule 31.05.2018

Я решил эту проблему, создав собственный JsonConverter (и указав nswag использовать его при создании моего клиента).

Преобразователь выглядит примерно так:

public class AjaxWrapperConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanWrite => false;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Read about this problem here:
        // https://stackoverflow.com/questions/45777820/asp-net-boilerplate-generating-c-sharp-swagger-client-using-swagger-codegen-to

        var token = JToken.Load(reader);
        var tokenResult = token.First.First;
        var result = tokenResult.ToObject(objectType);

        return result;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(TypeIWantToUnwrap) || objectType == typeof(TypeIWantToUnwrap2);
    }
}
person eveneveneven    schedule 21.04.2019