Пример #1
0
        /// <inheritdoc />
        public override async Task WriteObjectAsync(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
        {
            if (messageWriter == null)
            {
                throw Error.ArgumentNull(nameof(messageWriter));
            }

            if (writeContext == null)
            {
                throw Error.ArgumentNull(nameof(writeContext));
            }

            IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase;

            IEdmTypeReference resourceSetType = writeContext.GetEdmType(graph, type);

            Contract.Assert(resourceSetType != null);

            IEdmStructuredTypeReference resourceType = GetResourceType(resourceSetType);

            ODataWriter writer = await messageWriter.CreateODataResourceSetWriterAsync(entitySet, resourceType.StructuredDefinition())
                                 .ConfigureAwait(false);

            await WriteObjectInlineAsync(graph, resourceSetType, writer, writeContext)
            .ConfigureAwait(false);
        }
Пример #2
0
        public static async Task SerializeAsync(OeQueryContext queryContext, IAsyncEnumerator <Object> asyncEnumerator,
                                                String contentType, Stream stream, OeEntryFactory entryFactory, IServiceProvider?serviceProvider, CancellationToken cancellationToken)
        {
            var settings = new ODataMessageWriterSettings()
            {
                BaseUri = queryContext.ODataUri.ServiceRoot,
                EnableMessageStreamDisposal = false,
                ODataUri    = queryContext.ODataUri,
                Validations = ValidationKinds.ThrowOnDuplicatePropertyNames,
                Version     = ODataVersion.V4
            };

            if (serviceProvider != null)
            {
                serviceProvider = new ServiceProvider(serviceProvider, settings);
            }

            IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(stream, contentType, serviceProvider);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet);
                ODataWriter writer = await messageWriter.CreateODataResourceSetWriterAsync(entryFactory.EntitySet, entryFactory.EdmEntityType);

                var odataWriter = new OeODataWriter(queryContext, writer, cancellationToken);
                await odataWriter.WriteAsync(entryFactory, asyncEnumerator).ConfigureAwait(false);
            }
        }
Пример #3
0
        public async Task WriteCustomers(IEnumerable <Customer> payload, Stream stream)
        {
            var sw = new Stopwatch();

            sw.Start();
            var settings = new ODataMessageWriterSettings();

            settings.ODataUri = new ODataUri
            {
                ServiceRoot = new Uri("https://services.odata.org/V4/OData/OData.svc/")
            };
            var             model   = _model;
            InMemoryMessage message = new InMemoryMessage {
                Stream = stream
            };

            var messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, model);
            var entitySet     = model.EntityContainer.FindEntitySet("Customers");
            var writer        = await messageWriter.CreateODataResourceSetWriterAsync(entitySet);

            var resourceSet = new ODataResourceSet();
            //Console.WriteLine("Start writing resource set");
            await writer.WriteStartAsync(resourceSet);

            //Console.WriteLine("About to write resources {0}", payload.Count());

            foreach (var customer in payload)
            {
                // await resourceSerializer.WriteObjectInlineAsync(item, elementType, writer, writeContext);
                // create resource with only primitive types
                var resource = new ODataResource
                {
                    Properties = new[]
                    {
                        new ODataProperty
                        {
                            Name  = "Id",
                            Value = customer.Id
                        },
                        new ODataProperty {
                            Name = "Name", Value = customer.Name
                        },
                        new ODataProperty
                        {
                            Name  = "Emails",
                            Value = new ODataCollectionValue
                            {
                                Items    = customer.Emails,
                                TypeName = "Collection(Edm.String)"
                            }
                        }
                    }
                };

                //Console.WriteLine("Start writing resource {0}", customer.Id);
                await writer.WriteStartAsync(resource);

                // skip WriterStreamPropertiesAsync
                // WriteComplexPropertiesAsync
                // -- HomeAddress
                var homeAddressInfo = new ODataNestedResourceInfo
                {
                    Name         = "HomeAddress",
                    IsCollection = false
                };
                // start write homeAddress
                await writer.WriteStartAsync(homeAddressInfo);

                var homeAddressResource = new ODataResource
                {
                    Properties = new[]
                    {
                        new ODataProperty {
                            Name = "City", Value = customer.HomeAddress.City
                        },
                        new ODataProperty {
                            Name = "Street", Value = customer.HomeAddress.Street
                        }
                    }
                };
                await writer.WriteStartAsync(homeAddressResource);

                await writer.WriteEndAsync();

                // end write homeAddress
                await writer.WriteEndAsync();

                // -- End HomeAddress

                // -- Addresses
                var addressesInfo = new ODataNestedResourceInfo
                {
                    Name         = "Addresses",
                    IsCollection = true
                };
                // start addressesInfo
                await writer.WriteStartAsync(addressesInfo);

                var addressesResourceSet = new ODataResourceSet();
                // start addressesResourceSet
                await writer.WriteStartAsync(addressesResourceSet);

                foreach (var address in customer.Addresses)
                {
                    var addressResource = new ODataResource
                    {
                        Properties = new[]
                        {
                            new ODataProperty {
                                Name = "City", Value = address.City
                            },
                            new ODataProperty {
                                Name = "Street", Value = address.Street
                            }
                        }
                    };

                    await writer.WriteStartAsync(addressResource);

                    await writer.WriteEndAsync();
                }

                // end addressesResourceSet
                await writer.WriteEndAsync();


                // end addressesInfo
                await writer.WriteEndAsync();

                // -- End Addresses

                // end write resource
                await writer.WriteEndAsync();

                //Console.WriteLine("Finish writing resource {0}", customer.Id);
                //Console.WriteLine("Finised customer {0}", customer.Id);
            }
            await writer.WriteEndAsync();
        }