Я использую Autorest для генерации кода для вызова моего 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
Я не хочу проходить сгенерированный код, добавляя атрибут
[Сериализуемый]
для каждого типа, потому что код будет перезаписан при следующем создании.
Я просмотрел эту проблему в проекте Git Hub и там упоминается
Если в спецификации чванства есть определение модели, подобное этому
{
"Foo": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
}
},
"additionalProperties": {
"type": "string"
}
}
}
тогда сгенерированные Autorest SDK должны иметь возможность правильно сериализовать и десериализовать (туда-обратно) неизвестные свойства.
Сгенерированные клиенты C# сегодня поддерживают это, имея Dictionary AdditionalProperties.
Итак, теперь я пытаюсь понять, что такое спецификация Autorest и как я ее настраиваю.
В startup.cs у меня в Configure
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 = "[email protected]"
}
});
c.EnableAnnotations();
c.DescribeAllEnumsAsStrings();
c.ParameterFilter<SwaggerEnumParameterFilter>();
c.SchemaFilter<SwaggerEnumFilter>();
});