async Task GetPaper(string paper) { var descriptor = paperCatalog.FindPaperDescriptor(defaultCatalog, paper); if (descriptor == null) { var ret = Ret.Fail(HttpStatusCode.NotFound, $"O objeto não existe: {defaultCatalog}/{paper}"); await Res.SendEntityStatusAsync(ret); return; } object output; var instance = objectFactory.CreateObject(descriptor.PaperType); if (instance._HasMethod("Render")) { output = objectFactory.Call(instance, "Render", null); } else { throw new HttpException($"Não há um algoritmo de renderização conhecido para objeto do tipo ${descriptor.PaperType.FullName}."); } if (output is Stream stream) { await stream.CopyToAsync(Res.Body); await Res.Body.FlushAsync(); } else if (output is StreamReader reader) { var encoding = Encoding.UTF8; var writer = new StreamWriter(Res.Body, encoding); await reader.CopyToAsync(writer); await writer.FlushAsync(); await Res.Body.FlushAsync(); } else if (output is Entity entity) { var encoding = Encoding.UTF8; var mimeType = "json"; var serializer = new MediaSerializer(mimeType); serializer.Serialize(entity, Res.Body, encoding); await Res.Body.FlushAsync(); } else { throw new HttpException($"Não há suporte para renderização de dados do tipo {output.GetType().FullName}"); } }