Exemplo n.º 1
0
        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}");
            }
        }