ASP网络样板文件>;使用swagger codegen工具(nswag)生成C#swagger客户端不工作

ASP网络样板文件>;使用swagger codegen工具(nswag)生成C#swagger客户端不工作,c#,swagger-codegen,asp.net-boilerplate,nswag,C#,Swagger Codegen,Asp.net Boilerplate,Nswag,我尝试为我用ASP Net样板创建的和API生成c#代码,但响应没有正确反序列化 经过调查,json响应似乎是使用一个名为“AjaxResponse”的类包装的;但是,swagger.json在方法响应中不包含此类型 有人知道如何构建一个C#Swagger客户机来解释包装结果吗?Aspnet样板文件将真实结果包装在AjaxResponse中。该类是泛型类型类。Swaggergen工具无法生成正确的代理类,因为在运行时包装结果。 因此,Swagger抓取的api签名是原始结果(未包装) 因此,唯一

我尝试为我用ASP Net样板创建的和API生成c#代码,但响应没有正确反序列化

经过调查,json响应似乎是使用一个名为“AjaxResponse”的类包装的;但是,swagger.json在方法响应中不包含此类型


有人知道如何构建一个C#Swagger客户机来解释包装结果吗?

Aspnet样板文件将真实结果包装在AjaxResponse中。该类是泛型类型类。Swaggergen工具无法生成正确的代理类,因为在运行时包装结果。 因此,Swagger抓取的api签名是原始结果(未包装)

因此,唯一的解决方案是禁用解决方案范围的自动包装器。将这两行代码添加到Web.Core项目中的PreInitialize()方法中。你的问题就会解决

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

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

您还可以对单个应用程序方法使用[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; }
    }
公共类RequestResultAJAX
{
公共bool成功{get;set;}
公共T结果{get;set;}
公共字符串错误{get;set;}
公共字符串targetUrl{get;set;}
公共字符串unAuthorizedRequest{get;set;}
公共字符串uu abp{get;set;}
}
替换生成的客户端方法中的所有反序列化点:

result_ = Newtonsoft.Json.JsonConvert.DeserializeObject<Dto>(responseData_, _settings.Value);
result\uu=Newtonsoft.Json.JsonConvert.DeserializeObject(responseData\uu,\u settings.Value);

result\uu=Newtonsoft.Json.JsonConvert.DeserializeObject(responseData\uu,\u settings.Value).result;

并在返回结果之前添加成功/错误复选框。

我通过创建自定义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);
    }
}
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);
    }
}