Я использую Авторест для генерации кода для вызова моего API.
Я хочу использовать следующее в своих модульных тестах
private JobHeaderRequestObject MakeRequestFromResponse(JobHeaderResponseObject InResponseObject)
{
// make use of the fact that in the server side code we know JobHeaderResponseObject inherits from JobHeaderRequestObject
return MySerializer.DeepConvert<JobHeaderResponseObject,JobHeaderRequestObject>(InResponseObject);
}
internal class MySerializer
{
public static T2 DeepConvert<T1,T2>(T1 obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T2)formatter.Deserialize(ms);
}
}
}
Однако, когда я пытаюсь запустить этот код, я получаюошибка с упоминанием
System.Runtime.Serialization.SerializationException
, указывающая, что тип
is not marked as serializable
Я не хочу проходить через сгенерированный код, добавляя атрибут
[Serializable]
для каждого типа, потому что код будет перезаписан при следующем генерировании.
Я рассмотрел эту проблему в проекте Git Hub и упоминает
Если у спецификации сваггера есть определение модели, подобное этому
{
"Foo": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
}
},
"additionalProperties": {
"type": "string"
}
}
}
, то сгенерированные Autorest SDK должны иметь возможность сериализовать и десериализовать (в оба конца) неизвестные свойства правильно.
Созданные клиенты C # поддерживают это сегодня, имея словарь AdditionalProperties.
Итак, теперь я пытаюсь понять, что такое спецификация Autorest и как я ее настроил.
В startup.cs у меня в настройках35 *
app.UseSwagger(c =>
{
c.RouteTemplate =
"api-docs/{documentName}/swagger.json";
});
app.UseSwaggerUI(c =>
{
//Include virtual directory if site is configured so
c.RoutePrefix = "api-docs";
c.SwaggerEndpoint("./v1/swagger.json", "Api v1");
});
В ConfigureServices у меня есть
services.AddSwaggerGen(c =>
{
c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "My API",
Description = "ASP.NET Core Web API",
TermsOfService = "None",
Contact = new Swashbuckle.AspNetCore.Swagger.Contact
{
Name = "MyName",
Email = "MyEmail@Mydomain.com"
}
});
c.EnableAnnotations();
c.DescribeAllEnumsAsStrings();
c.ParameterFilter<SwaggerEnumParameterFilter>();
c.SchemaFilter<SwaggerEnumFilter>();
});