首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >>使用swagger codegen工具生成C# swagger客户端(nswag)不起作用

>使用swagger codegen工具生成C# swagger客户端(nswag)不起作用
EN

Stack Overflow用户
提问于 2017-08-20 10:01:36
回答 3查看 1.4K关注 0票数 4

我尝试为使用ASP.NET样板创建的和应用程序接口生成c#代码,但响应不能正确反序列化。

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

有没有人知道如何构建一个C# Swagger客户端来处理包装结果?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-21 16:22:25

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

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

代码语言:javascript
复制
Configuration.Modules.AbpAspNetCore().DefaultWrapResultAttribute.WrapOnError = false;

Configuration.Modules.AbpAspNetCore().DefaultWrapResultAttribute.WrapOnSuccess = false;
票数 7
EN

Stack Overflow用户

发布于 2018-05-31 17:02:28

您还可以对各个应用程序方法使用DontWrapResult/WrapResult属性。

代码语言:javascript
复制
[WrapResult(LogError =false, WrapOnSuccess = true, WrapOnError = true)]
SomeApplicationServiceMethod()

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

如果您不能做到这一点,那么您可以在客户端进行相同的更改:

添加下一个类:

代码语言:javascript
复制
 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; }
    }

替换生成的客户端方法中的所有反序列化点:

代码语言:javascript
复制
result_ = Newtonsoft.Json.JsonConvert.DeserializeObject<Dto>(responseData_, _settings.Value);

通过

代码语言:javascript
复制
result_ = Newtonsoft.Json.JsonConvert.DeserializeObject<RequestResultAJAX<Dto>>(responseData_, _settings.Value).result;

并在返回结果前添加成功/错误检查。

票数 1
EN

Stack Overflow用户

发布于 2019-04-21 16:23:01

我通过创建一个自定义的JsonConverter (并告诉nswag在生成我的客户端时使用它)解决了这个问题。

转换器看起来像这样:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45777820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档