[英]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.