簡體   English   中英

ASP NET Boilerplate>使用swagger codegen工具(nswag)生成C#swagger客戶端無法正常工作

[英]ASP NET Boilerplate > Generating C# swagger client using swagger codegen tool (nswag) not working

我嘗試生成使用ASP Net Boilerplate創建的c#代碼和API,但響應未正確反序列化。

經過調查,似乎json響應是使用一個名為“AjaxResponse”的類包裝的; 但是,swagger.json在方法響應中不包含此類型。

有誰知道如何構建一個C#Swagger客戶端來解釋包裝結果?

Aspnet Boilerplate在AjaxResponse中包含真實結果。 AjaxResponse類是泛型類。 Swaggergen工具無法生成正確的代理類,因為在運行時包裝結果。 因此,由Swagger抓住的api的簽名是原始結果(未包裝)。

因此,唯一的解決方案是禁用解決方案范圍內的自動包裝器。 將2行添加到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; }
    }

替換生成的客戶端方法中的所有反序列化點:

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

通過

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

並在返回結果之前添加成功/錯誤cheks。

我通過創建自定義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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM