我尝试生成使用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);
}
}