コード例 #1
0
        public void WriteCompletedAsyncResponse()
        {
            var asyncWriter = this.TestInit();

            var innerMessage = asyncWriter.CreateResponseMessage();

            innerMessage.StatusCode = 200;
            innerMessage.SetHeader("Content-Type", "application/json");

            var settings = new ODataMessageWriterSettings();

            settings.SetServiceDocumentUri(new Uri(ServiceDocumentUri));
            settings.EnableMessageStreamDisposal = false;

            using (var innerMessageWriter = new ODataMessageWriter(innerMessage, settings, this.userModel))
            {
                var entryWriter = innerMessageWriter.CreateODataResourceWriter(singleton, testType);
                var entry       = new ODataResource()
                {
                    TypeName = "NS.Test", Properties = new[] { new ODataProperty()
                                                               {
                                                                   Name = "Id", Value = 1
                                                               } }
                };
                entryWriter.WriteStart(entry);
                entryWriter.WriteEnd();
            }

            asyncWriter.Flush();

            var payload = this.TestFinish();

            Assert.Equal("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nOData-Version: 4.0\r\n\r\n{\"@odata.context\":\"http://host/service/$metadata#MySingleton\",\"Id\":1}", payload);
        }
コード例 #2
0
        private void WriteEntity(Stream stream, OeEntityItem entityItem)
        {
            var settings = new ODataMessageWriterSettings()
            {
                BaseUri  = _baseUri,
                Version  = ODataVersion.V4,
                ODataUri = new ODataUri()
                {
                    ServiceRoot = _baseUri
                },
                EnableMessageStreamDisposal = false
            };

            IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, null);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, _model))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.Resource);
                ODataWriter writer = messageWriter.CreateODataResourceWriter(entityItem.EntitySet, entityItem.EntityType);

                entityItem.RefreshEntry();
                writer.WriteStart(entityItem.Entry);
                writer.WriteEnd();
            }
        }
コード例 #3
0
        private string GetWriterOutputForContentTypeAndKnobValue(ODataResource entry, EdmModel model, IEdmEntitySetBase entitySet, EdmEntityType entityType)
        {
            MemoryStream          outputStream = new MemoryStream();
            IODataResponseMessage message      = new InMemoryMessage()
            {
                Stream = outputStream
            };

            message.SetHeader("Content-Type", "application/json;odata.metadata=full");
            ODataMessageWriterSettings settings = new ODataMessageWriterSettings();

            settings.SetServiceDocumentUri(new Uri("http://example.com"));

            string output;

            using (var messageWriter = new ODataMessageWriter(message, settings, model))
            {
                ODataWriter writer = messageWriter.CreateODataResourceWriter(entitySet, entityType);
                writer.WriteStart(entry);
                writer.WriteEnd();
                outputStream.Seek(0, SeekOrigin.Begin);
                output = new StreamReader(outputStream).ReadToEnd();
            }

            return(output);
        }
        private string SerializeEntryInFullMetadataJson(
            bool useKeyAsSegment,
            IEdmModel edmModel,
            IEdmEntityType entityType = null,
            IEdmEntitySet entitySet   = null)
        {
            var settings = new ODataMessageWriterSettings {
            };

            settings.SetServiceDocumentUri(new Uri("http://example.com/"));
            var outputStream = new MemoryStream();
            var container    = ContainerBuilderHelper.BuildContainer(null);

            container.GetRequiredService <ODataSimplifiedOptions>().EnableWritingKeyAsSegment = useKeyAsSegment;
            var responseMessage = new InMemoryMessage {
                Stream = outputStream, Container = container
            };

            responseMessage.SetHeader("Content-Type", "application/json;odata.metadata=full");
            string output;

            using (var messageWriter = new ODataMessageWriter((IODataResponseMessage)responseMessage, settings, edmModel))
            {
                var           entryWriter = messageWriter.CreateODataResourceWriter(entitySet, entityType);
                ODataProperty keyProperty = new ODataProperty()
                {
                    Name = "Key", Value = "KeyValue"
                };

                var entry = new ODataResource {
                    Properties = new[] { keyProperty }, TypeName = "Namespace.Person"
                };

                if (edmModel == null)
                {
                    keyProperty.SetSerializationInfo(new ODataPropertySerializationInfo
                    {
                        PropertyKind = ODataPropertyKind.Key
                    });

                    entry.SetSerializationInfo(new ODataResourceSerializationInfo
                    {
                        NavigationSourceEntityTypeName = "Namespace.Person",
                        NavigationSourceName           = "People",
                        ExpectedTypeName     = "Namespace.Person",
                        NavigationSourceKind = EdmNavigationSourceKind.EntitySet
                    });
                }

                entryWriter.WriteStart(entry);
                entryWriter.WriteEnd();
                entryWriter.Flush();

                outputStream.Seek(0, SeekOrigin.Begin);
                output = new StreamReader(outputStream).ReadToEnd();
            }

            return(output);
        }
コード例 #5
0
        public static string ConvertToOData(object value)
        {
            // TODO:
            // 1. if primitive
            // 2. if enum
            // 3. if collection of (primitive or enum)

            // 4.
            InMemoryMessage message = new InMemoryMessage();

            message.SetHeader("Content-Type", "application/json;odata.metadata=minimal");
            message.Stream = new MemoryStream();

            var settings = new ODataMessageWriterSettings
            {
                ODataUri = new ODataUri
                {
                    ServiceRoot = new Uri("http://localhost/"),
                },
            };
            var model  = GetEdmModel(value.GetType());
            var writer = new ODataMessageWriter((IODataResponseMessage)message, settings, model);

            IEdmEntitySet entitySet    = model.FindDeclaredEntitySet(value.GetType().Name + "s");
            ODataWriter   odataWriter  = writer.CreateODataResourceWriter(entitySet);
            Type          valueType    = value.GetType();
            bool          isCollection = IsCollection(valueType, out Type elementType);

            if (value == null)
            {
                if (isCollection)
                {
                    odataWriter.WriteStart(new ODataResourceSet
                    {
                        TypeName = "Collection(" + elementType.FullName + ")"
                    });
                }
                else
                {
                    odataWriter.WriteStart(resource: null);
                }

                odataWriter.WriteEnd();
            }
            else
            {
                if (isCollection)
                {
                    WriteResourceSet(model, odataWriter, value);
                }
                else
                {
                    WriteResource(model, odataWriter, value);
                }
            }

            message.Stream.Position = 0;
            return((new StreamReader(message.Stream)).ReadToEnd());
        }
コード例 #6
0
        private static string WriteJsonLightEntryForUndeclared(bool isOpenType, Action <ODataWriter> writeAction, bool throwOnUndeclaredProperty = true)
        {
            EdmModel model = new EdmModel();

            AddAndGetComplexType(model);
            EdmEntityType entityType = AddAndGetEntityType(model);

            if (isOpenType)
            {
                entityType = AddAndGetOpenEntityType(model);
            }
            var entitySet = GetEntitySet(model, entityType);

            var requestUri = new Uri("http://temp.org/FakeSet('parent')");
            var odataUri   = new ODataUri {
                RequestUri = requestUri
            };

            odataUri.Path = new ODataUriParser(model, new Uri("http://temp.org/"), requestUri).ParsePath();

            var stream  = new MemoryStream();
            var message = new InMemoryMessage {
                Stream = stream
            };

            var settings = new ODataMessageWriterSettings {
                Version = ODataVersion.V4
            };

            if (!throwOnUndeclaredProperty)
            {
                settings.Validations &= ~ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType;
            }
            settings.ODataUri = odataUri;
            settings.SetServiceDocumentUri(new Uri("http://temp.org"));

            settings.SetContentType(ODataFormat.Json);
            settings.SetContentType("application/json;odata.metadata=full", null);

            ODataMessageWriter messageWriter;

            messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, model);
            ODataWriter writer = null;

            writer = messageWriter.CreateODataResourceWriter(entitySet, entityType);

            if (writeAction != null)
            {
                writeAction(writer);
            }

            writer.Flush();

            var actual = Encoding.UTF8.GetString(stream.ToArray());

            return(actual);
        }
コード例 #7
0
ファイル: UpdateTests.cs プロジェクト: marismore/odata.net
        public void PutEntity()
        {
            int RequestsPerIteration = 100;

            foreach (var iteration in Benchmark.Iterations)
            {
                int PersonIdBase = 1;

                ResetDataSource();

                using (iteration.StartMeasurement())
                {
                    for (int i = 0; i < RequestsPerIteration; i++)
                    {
                        ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings()
                        {
                            BaseUri = serviceFixture.ServiceBaseUri
                        };
                        writerSettings.ODataUri = new ODataUri()
                        {
                            ServiceRoot = serviceFixture.ServiceBaseUri
                        };
                        var requestMessage = new HttpWebRequestMessage(new Uri(serviceFixture.ServiceBaseUri.AbsoluteUri + "SimplePeopleSet(" + PersonIdBase + ")", UriKind.Absolute));
                        requestMessage.Method = "PUT";

                        var peopleEntry = new ODataResource()
                        {
                            Properties = new[]
                            {
                                new ODataProperty {
                                    Name = "PersonID", Value = PersonIdBase++
                                },
                                new ODataProperty {
                                    Name = "FirstName", Value = "PostEntity"
                                },
                                new ODataProperty {
                                    Name = "LastName", Value = "PostEntity"
                                },
                                new ODataProperty {
                                    Name = "MiddleName", Value = "NewMiddleName"
                                }
                            },
                        };

                        using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings))
                        {
                            var odataWriter = messageWriter.CreateODataResourceWriter();
                            odataWriter.WriteStart(peopleEntry);
                            odataWriter.WriteEnd();
                        }
                        var responseMessage = requestMessage.GetResponse();
                        Assert.Equal(204, responseMessage.StatusCode);
                    }
                }
            }
        }
        private void WriteAnnotationsAndValidatePayload(Action <ODataWriter> action, IEdmNavigationSource navigationSource, ODataFormat format, string expectedPayload, bool request, bool createFeedWriter, bool enableWritingODataAnnotationWithoutPrefix = false, IEdmStructuredType resourceType = null)
        {
            var writerSettings = new ODataMessageWriterSettings {
                EnableMessageStreamDisposal = false
            };

            writerSettings.SetContentType(format);
            writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com/"));

            var container = ContainerBuilderHelper.BuildContainer(null);

            container.GetRequiredService <ODataSimplifiedOptions>().SetOmitODataPrefix(
                enableWritingODataAnnotationWithoutPrefix);

            MemoryStream stream = new MemoryStream();

            if (request)
            {
                IODataRequestMessage requestMessageToWrite = new InMemoryMessage
                {
                    Method    = "GET",
                    Stream    = stream,
                    Container = container
                };
                using (var messageWriter = new ODataMessageWriter(requestMessageToWrite, writerSettings, Model))
                {
                    ODataWriter odataWriter = (createFeedWriter && !(navigationSource is EdmSingleton))
                        ? messageWriter.CreateODataResourceSetWriter(navigationSource as EdmEntitySet, EntityType)
                        : messageWriter.CreateODataResourceWriter(navigationSource, resourceType ?? EntityType);
                    action(odataWriter);
                }
            }
            else
            {
                IODataResponseMessage responseMessageToWrite = new InMemoryMessage
                {
                    StatusCode = 200,
                    Stream     = stream,
                    Container  = container
                };
                responseMessageToWrite.PreferenceAppliedHeader().AnnotationFilter = "*";
                using (var messageWriter = new ODataMessageWriter(responseMessageToWrite, writerSettings, Model))
                {
                    ODataWriter odataWriter = (createFeedWriter && !(navigationSource is EdmSingleton))
                        ? messageWriter.CreateODataResourceSetWriter(navigationSource as EdmEntitySet, EntityType)
                        : messageWriter.CreateODataResourceWriter(navigationSource, resourceType ?? EntityType);
                    action(odataWriter);
                }
            }

            stream.Position = 0;
            string payload = (new StreamReader(stream)).ReadToEnd();

            Assert.Equal(expectedPayload, payload);
        }
コード例 #9
0
        public string GetSampleEntityPayload(object entity, IEnumerable <string> projectedProperties)
        {
            var message = new SimpleResponseMessage(this.StatusCode, this.ContentType);

            using (var writer = new ODataMessageWriter(message, Settings))
            {
                WriteEntry(writer.CreateODataResourceWriter(), entity, projectedProperties);
            }

            return(message.GetMessageString());
        }
コード例 #10
0
        public void PostEntity()
        {
            int RequestsPerIteration = 100;
            int PersonIdBase         = 100;

            for (int i = 0; i < RequestsPerIteration; i++)
            {
                ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings()
                {
                    BaseUri = serviceFixture.ServiceBaseUri
                };
                writerSettings.ODataUri = new ODataUri()
                {
                    ServiceRoot = serviceFixture.ServiceBaseUri
                };
                var requestMessage =
                    new HttpWebRequestMessage(
                        new Uri(serviceFixture.ServiceBaseUri.AbsoluteUri + "SimplePeopleSet", UriKind.Absolute));
                requestMessage.Method = "POST";

                var peopleEntry = new ODataResource()
                {
                    EditLink   = new Uri("/SimplePeopleSet(" + (PersonIdBase++) + ")", UriKind.Relative),
                    Id         = new Uri("/SimplePeopleSet(" + PersonIdBase + ")", UriKind.Relative),
                    TypeName   = NameSpacePrefix + "Person",
                    Properties = new[]
                    {
                        new ODataProperty {
                            Name = "PersonID", Value = PersonIdBase
                        },
                        new ODataProperty {
                            Name = "FirstName", Value = "PostEntity"
                        },
                        new ODataProperty {
                            Name = "LastName", Value = "PostEntity"
                        },
                        new ODataProperty {
                            Name = "MiddleName", Value = "PostEntity"
                        }
                    },
                };

                using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter();
                    odataWriter.WriteStart(peopleEntry);
                    odataWriter.WriteEnd();
                }

                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(201, responseMessage.StatusCode);
            }
        }
コード例 #11
0
        public void TestCreateODataEntryWriter_InJsonLight_WithoutEntitySetOrType_DoesNotThrow()
        {
            // Arrange
            IODataResponseMessage      response = CreateResponse();
            ODataMessageWriterSettings settings = CreateJsonLightSettings();
            IEdmModel model = CreateModel();

            using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model))
            {
                // Act & Assert
                ExceptionAssert.DoesNotThrow(() => writer.CreateODataResourceWriter());
            }
        }
コード例 #12
0
        private void WriteEntity(Stream stream, OeEntityItem entityItem)
        {
            IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, null);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, _settings, _model))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.Resource);
                ODataWriter writer = messageWriter.CreateODataResourceWriter(entityItem.EntitySet, entityItem.EntityType);

                writer.WriteStart(entityItem.Entry);
                writer.WriteEnd();
            }
        }
コード例 #13
0
        public void UpdateEnumProperty()
        {
            // query an entry
            ODataResource productEntry = this.QueryEntityItem("Products(5)") as ODataResource;

            // send a request to update an entry property
            productEntry = new ODataResource()
            {
                TypeName   = NameSpacePrefix + "Product",
                Properties = new[]
                {
                    new ODataProperty {
                        Name = "SkinColor", Value = new ODataEnumValue("Green")
                    },
                    new ODataProperty {
                        Name = "UserAccess", Value = new ODataEnumValue("Read")
                    }
                }
            };

            var settings = new ODataMessageWriterSettings();

            settings.BaseUri = ServiceBaseUri;
            var productType = Model.FindDeclaredType(NameSpacePrefix + "Product") as IEdmEntityType;
            var productSet  = Model.EntityContainer.FindEntitySet("Products");

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "Products(5)"));
                requestMessage.SetHeader("Content-Type", mimeType);
                requestMessage.SetHeader("Accept", mimeType);
                requestMessage.Method = "PATCH";

                using (var messageWriter = new ODataMessageWriter(requestMessage, settings, Model))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter(productSet, productType);
                    odataWriter.WriteStart(productEntry);
                    odataWriter.WriteEnd();
                }

                var responseMessage = requestMessage.GetResponse();

                // verify the update
                Assert.AreEqual(204, responseMessage.StatusCode);
                ODataResource  updatedProduct = this.QueryEntityItem("Products(5)") as ODataResource;
                ODataEnumValue skinColor      = updatedProduct.Properties.Single(p => p.Name == "SkinColor").Value as ODataEnumValue;
                ODataEnumValue userAccess     = updatedProduct.Properties.Single(p => p.Name == "UserAccess").Value as ODataEnumValue;
                Assert.AreEqual("Green", skinColor.Value);
                Assert.AreEqual("Read", userAccess.Value);
            }
        }
コード例 #14
0
        public void EntryMetadataUrlRoundTrip()
        {
            var stream = new MemoryStream();
            var writerRequestMemoryMessage = new InMemoryMessage();

            writerRequestMemoryMessage.Stream = stream;
            writerRequestMemoryMessage.SetHeader("Content-Type", "application/json");

            var writerSettings = new ODataMessageWriterSettings()
            {
                Version = ODataVersion.V4, EnableMessageStreamDisposal = false
            };

            writerSettings.ODataUri = new ODataUri()
            {
                ServiceRoot = new Uri("http://christro.svc/")
            };

            var messageWriter         = new ODataMessageWriter((IODataResponseMessage)writerRequestMemoryMessage, writerSettings, this.model);
            var organizationSetWriter = messageWriter.CreateODataResourceWriter(this.organizationsSet);
            var odataEntry            = new ODataResource()
            {
                TypeName = ModelNamespace + ".Corporation"
            };

            odataEntry.Property("Id", 1);
            odataEntry.Property("Name", "");
            odataEntry.Property("TickerSymbol", "MSFT");

            organizationSetWriter.WriteStart(odataEntry);
            organizationSetWriter.WriteEnd();

            var readerPayloadInput = Encoding.UTF8.GetString(stream.GetBuffer());

            Console.WriteLine(readerPayloadInput);

            var readerResponseMemoryMessage = new InMemoryMessage();

            readerResponseMemoryMessage.Stream = new MemoryStream(stream.GetBuffer());
            readerResponseMemoryMessage.SetHeader("Content-Type", "application/json");

            var messageReader = new ODataMessageReader((IODataResponseMessage)readerResponseMemoryMessage, new ODataMessageReaderSettings()
            {
                MaxProtocolVersion = ODataVersion.V4, EnableMessageStreamDisposal = false
            }, this.model);
            var organizationReader = messageReader.CreateODataResourceReader(this.organizationsSet, this.organizationsSet.EntityType());

            organizationReader.Read().Should().Be(true);
            organizationReader.Item.As <ODataResource>();
        }
コード例 #15
0
        public void TestCreateODataEntryWriter_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow()
        {
            // Arrange
            IODataResponseMessage      response = CreateResponse();
            ODataMessageWriterSettings settings = CreateJsonLightSettings();
            IEdmModel     model     = CreateModel();
            IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First();

            using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model))
            {
                // Act & Assert
                Assert.DoesNotThrow(() => writer.CreateODataResourceWriter(entitySet));
            }
        }
コード例 #16
0
        public void BasicTest()
        {
            Model = GetModel();

            // create entry and insert
            var personEntry = new ODataResource()
            {
                TypeName = nameSpace + ".Person"
            };
            var userName = new ODataProperty {
                Name = "UserName", Value = "Test"
            };
            var firstName = new ODataProperty {
                Name = "FirstName", Value = "Test"
            };
            var lastName = new ODataProperty {
                Name = "LastName", Value = "1"
            };
            var emails = new ODataProperty {
                Name = "Emails", Value = new ODataCollectionValue()
            };

            personEntry.Properties = new[] { userName, firstName, lastName, emails };

            var settings = new ODataMessageWriterSettings();

            settings.BaseUri = baseUri;

            var personType = Model.FindDeclaredType(nameSpace + ".Person") as IEdmEntityType;
            var people     = Model.EntityContainer.FindEntitySet("People");

            var requestMessage = new HttpWebRequestMessage(new Uri(settings.BaseUri + "People"));

            requestMessage.SetHeader("Content-Type", "application/json");
            requestMessage.SetHeader("Accept", "application/json");
            requestMessage.Method = "POST";
            using (var messageWriter = new ODataMessageWriter(requestMessage, settings))
            {
                var odataWriter = messageWriter.CreateODataResourceWriter(people, personType);
                odataWriter.WriteStart(personEntry);
                odataWriter.WriteEnd();
            }

            var responseMessage = requestMessage.GetResponse();

            int expectedStatus = 201;

            Assert.True(expectedStatus.Equals(responseMessage.StatusCode));
        }
コード例 #17
0
        private void UpdateEntry(string singletonType, string singletonName, string mimeType, IEnumerable <object> properties)
        {
            ODataResource entry = new ODataResource()
            {
                TypeName = NameSpacePrefix + singletonType
            };
            var elementType = properties != null && properties.Count() > 0 ? properties.ElementAt(0).GetType() : null;

            if (elementType == typeof(ODataProperty))
            {
                entry.Properties = properties.Cast <ODataProperty>();
            }

            var settings = new ODataMessageWriterSettings();

            settings.BaseUri = ServiceBaseUri;

            var customerType = Model.FindDeclaredType(NameSpacePrefix + singletonType) as IEdmEntityType;
            var customerSet  = Model.EntityContainer.FindSingleton(singletonName);

            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + singletonName));

            requestMessage.SetHeader("Content-Type", mimeType);
            requestMessage.SetHeader("Accept", mimeType);
            requestMessage.Method = "PATCH";

            using (var messageWriter = new ODataMessageWriter(requestMessage, settings))
            {
                var odataWriter = messageWriter.CreateODataResourceWriter(customerSet, customerType);
                odataWriter.WriteStart(entry);
                if (elementType == typeof(ODataNestedResourceInfo))
                {
                    foreach (var p in properties)
                    {
                        var nestedInfo = (ODataNestedResourceInfo)p;
                        odataWriter.WriteStart(nestedInfo);
                        odataWriter.WriteStart(nestedInfo.GetAnnotation <ODataResource>());
                        odataWriter.WriteEnd();
                        odataWriter.WriteEnd();
                    }
                }
                odataWriter.WriteEnd();
            }

            var responseMessage = requestMessage.GetResponse();

            // verify the update
            Assert.Equal(204, responseMessage.StatusCode);
        }
        private string WriterEntry(IEdmModel userModel, ODataResource entry, EdmEntitySet entitySet, IEdmEntityType entityType,
                                   bool fullMetadata = false, Action <ODataWriter> writeAction = null, ODataStringEscapeOption?stringEscapeOption = null)
        {
            var message = new InMemoryMessage()
            {
                Stream = new MemoryStream()
            };

            if (stringEscapeOption != null)
            {
                var containerBuilder = new Test.OData.DependencyInjection.TestContainerBuilder();
                containerBuilder.AddDefaultODataServices();
                containerBuilder.AddService <IJsonWriterFactory>(ServiceLifetime.Singleton, sp => new DefaultJsonWriterFactory(stringEscapeOption.Value));
                message.Container = containerBuilder.BuildContainer();
            }

            var writerSettings = new ODataMessageWriterSettings {
                EnableMessageStreamDisposal = false
            };

            writerSettings.SetContentType(ODataFormat.Json);
            writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com"));
            writerSettings.SetContentType(fullMetadata ?
                                          "application/json;odata.metadata=full;odata.streaming=false" :
                                          "application/json;odata.metadata=minimal;odata.streaming=false", "utf-8");

            using (var msgReader = new ODataMessageWriter((IODataResponseMessage)message, writerSettings, userModel))
            {
                var writer = msgReader.CreateODataResourceWriter(entitySet, entityType);
                if (writeAction != null)
                {
                    writeAction(writer);
                }
                else
                {
                    writer.WriteStart(entry);
                    writer.WriteEnd();
                }
            }

            message.Stream.Seek(0, SeekOrigin.Begin);
            using (StreamReader reader = new StreamReader(message.Stream))
            {
                return(reader.ReadToEnd());
            }
        }
コード例 #19
0
        public void PostDeleteTypeInReferencingModel()
        {
            var entryWrapper = CreateVehicleGPS(true);

            #region Create and Delete
            var settings = new ODataMessageWriterSettings();
            settings.BaseUri = ServiceBaseUri;

            var vehicleGPSType = Model.FindType(TestModelNameSpace + ".GPS.VehicleGPSType") as IEdmEntityType;

            var vehicleGPSSet = Model.FindEntityContainer(TestModelNameSpace + ".GPS.GPSContainer").FindEntitySet("VehicleGPSSetInGPS");

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "VehicleGPSSetInGPS"));

                requestMessage.SetHeader("Content-Type", mimeType);
                requestMessage.SetHeader("Accept", mimeType);
                requestMessage.Method = "POST";
                using (var messageWriter = new ODataMessageWriter(requestMessage, settings, Model))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter(vehicleGPSSet, vehicleGPSType);
                    ODataWriterHelper.WriteResource(odataWriter, entryWrapper);
                }

                // send the http request
                var responseMessage = requestMessage.GetResponse();

                // Verify Created
                Assert.AreEqual(201, responseMessage.StatusCode);
                ODataResource entry = this.QueryEntityItem("VehicleGPSSetInGPS('000')") as ODataResource;
                Assert.AreEqual("000", entry.Properties.Single(p => p.Name == "Key").Value);

                // Delete the entry
                var deleteRequestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "VehicleGPSSetInGPS('000')"));
                deleteRequestMessage.Method = "DELETE";
                var deleteResponseMessage = deleteRequestMessage.GetResponse();

                // Verift Deleted
                Assert.AreEqual(204, deleteResponseMessage.StatusCode);
                ODataResource deletedEntry = this.QueryEntityItem("VehicleGPSSetInGPS('000')", 204) as ODataResource;
                Assert.IsNull(deletedEntry);
            }
            #endregion
        }
コード例 #20
0
        public void HandCraftEdmType()
        {
            foreach (var mimeType in this.testMimeTypes)
            {
                EdmModel edmModel = new EdmModel();

                EdmEntityType edmEntityType = new EdmEntityType(NameSpace, "Person");
                edmModel.AddElement(edmEntityType);
                var keyProperty = new EdmStructuralProperty(edmEntityType, "PersonId", EdmCoreModel.Instance.GetInt32(false));
                edmEntityType.AddKeys(new IEdmStructuralProperty[] { keyProperty });
                edmEntityType.AddProperty(keyProperty);
                var property = new EdmStructuralProperty(edmEntityType, "Name", EdmCoreModel.Instance.GetString(true));
                edmEntityType.AddKeys(new IEdmStructuralProperty[] { property });
                edmEntityType.AddProperty(property);

                var defaultContainer = new EdmEntityContainer(NameSpace, "DefaultContainer");
                edmModel.AddElement(defaultContainer);

                EdmEntitySet entitySet = new EdmEntitySet(defaultContainer, "Person", edmEntityType);
                defaultContainer.AddElement(entitySet);

                var settings = new ODataMessageWriterSettings();
                settings.ODataUri = new ODataUri()
                {
                    ServiceRoot = this.ServiceUri
                };
                var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream());
                responseMessageWithoutModel.SetHeader("Content-Type", mimeType);
                using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter(entitySet, edmEntityType);

                    var entry = this.CreatePersonEntryWithoutSerializationInfo();
                    odataWriter.WriteStart(entry);
                    odataWriter.WriteEnd();

                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        Assert.IsTrue(
                            WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream())
                            .Contains("Person/$entity"));
                    }
                }
            }
        }
コード例 #21
0
        public void UpdateEntityInstanceProperty()
        {
            // query an entry
            ODataResource customerEntry = this.QueryEntityItem("Customers(1)") as ODataResource;

            Assert.AreEqual("London", customerEntry.Properties.Single(p => p.Name == "City").Value);

            // send a request to update an entry property
            customerEntry = new ODataResource()
            {
                TypeName = NameSpacePrefix + "Customer"
            };
            customerEntry.Properties = new[] { new ODataProperty {
                                                   Name = "City", Value = "Seattle"
                                               } };

            var settings = new ODataMessageWriterSettings();

            settings.BaseUri = ServiceBaseUri;

            var customerType = Model.FindDeclaredType(NameSpacePrefix + "Customer") as IEdmEntityType;
            var customerSet  = Model.EntityContainer.FindEntitySet("Customers");

            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "Customers(1)"));

            requestMessage.SetHeader("Content-Type", MimeTypes.ApplicationJson);
            requestMessage.SetHeader("Accept", MimeTypes.ApplicationJson);
            requestMessage.Method = "PATCH";

            using (var messageWriter = new ODataMessageWriter(requestMessage, settings))
            {
                var odataWriter = messageWriter.CreateODataResourceWriter(customerSet, customerType);
                odataWriter.WriteStart(customerEntry);
                odataWriter.WriteEnd();
            }

            var responseMessage = requestMessage.GetResponse();

            // verify the update
            Assert.AreEqual(204, responseMessage.StatusCode);
            ODataResource updatedCustomer = this.QueryEntityItem("Customers(1)") as ODataResource;

            Assert.AreEqual("Seattle", updatedCustomer.Properties.Single(p => p.Name == "City").Value);
        }
コード例 #22
0
ファイル: MultiBindingTests.cs プロジェクト: zhonli/odata.net
        private static string WriteJsonLightEntry(IEdmModel model, IEdmEntitySet entitySet, Action <ODataWriter> writeAction, bool isFullMetadata = false)
        {
            var stream  = new MemoryStream();
            var message = new InMemoryMessage {
                Stream = stream
            };

            var settings = new ODataMessageWriterSettings {
                Version = ODataVersion.V4
            };
            var odataUri = new ODataUri {
                ServiceRoot = ServiceRoot
            };

            odataUri.Path     = new ODataUriParser(model, ServiceRoot, new Uri(ServiceRoot + "/EntitySet")).ParsePath();
            settings.ODataUri = odataUri;
            settings.SetServiceDocumentUri(ServiceRoot);

            settings.SetContentType(ODataFormat.Json);
            if (isFullMetadata)
            {
                settings.SetContentType("application/json;odata.metadata=full", null);
            }
            else
            {
                settings.SetContentType("application/json;odata.metadata=minimal", null);
            }

            var         messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, model);
            ODataWriter writer        = null;

            writer = messageWriter.CreateODataResourceWriter(entitySet);

            if (writeAction != null)
            {
                writeAction(writer);
            }

            writer.Flush();

            var actual = Encoding.UTF8.GetString(stream.ToArray());

            return(actual);
        }
コード例 #23
0
        private string WriteEntryPayload(EdmEntitySet entitySet, EdmEntityType entityType, Action <ODataWriter> action)
        {
            MemoryStream          stream  = new MemoryStream();
            IODataResponseMessage message = new InMemoryMessage()
            {
                Stream = stream
            };

            message.SetHeader("Content-Type", "application/json");
            writerSettings.SetServiceDocumentUri(new Uri("http://www.sampletest.com"));
            using (var msgReader = new ODataMessageWriter((IODataResponseMessage)message, writerSettings, this.serverModel))
            {
                var writer = msgReader.CreateODataResourceWriter(entitySet, entityType);
                action(writer);

                stream.Seek(0, SeekOrigin.Begin);
                string payload = (new StreamReader(stream)).ReadToEnd();
                return(payload);
            }
        }
コード例 #24
0
        /// <inheritdoc />
        public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter,
                                         ODataSerializerContext writeContext)
        {
            if (messageWriter == null)
            {
                throw Error.ArgumentNull("messageWriter");
            }

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

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

            Contract.Assert(edmType != null);

            IEdmNavigationSource navigationSource = writeContext.NavigationSource;
            ODataWriter          writer           = messageWriter.CreateODataResourceWriter(navigationSource, edmType.ToStructuredType());

            WriteObjectInline(graph, edmType, writer, writeContext);
        }
コード例 #25
0
        public void ChangeSerializationInfoAfterWriteStart()
        {
            foreach (var mimeType in this.testMimeTypes)
            {
                var settings = new ODataMessageWriterSettings();
                settings.ODataUri = new ODataUri()
                {
                    ServiceRoot = this.ServiceUri
                };

                var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream());
                responseMessageWithoutModel.SetHeader("Content-Type", mimeType);
                using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter();
                    var entry       = this.CreatePersonEntryWithoutSerializationInfo();

                    entry.SetSerializationInfo(new ODataResourceSerializationInfo()
                    {
                        NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person"
                    });
                    odataWriter.WriteStart(entry);
                    entry.SetSerializationInfo(new ODataResourceSerializationInfo()
                    {
                        NavigationSourceName = "Parsen", NavigationSourceEntityTypeName = NameSpace + "Person"
                    });
                    odataWriter.WriteEnd();

                    Stream stream = responseMessageWithoutModel.GetStream();

                    // nometadata option does not write odata.metadata in the payload
                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        Assert.IsTrue(WritePayloadHelper.ReadStreamContent(stream).Contains("Person/$entity"));
                    }
                }
            }
        }
コード例 #26
0
        public void PatchEntity()
        {
            int RequestsPerIteration = 100;
            int PersonIdBase         = 1;

            for (int i = 0; i < RequestsPerIteration; i++)
            {
                ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings()
                {
                    BaseUri = serviceFixture.ServiceBaseUri
                };
                writerSettings.ODataUri = new ODataUri()
                {
                    ServiceRoot = serviceFixture.ServiceBaseUri
                };
                var requestMessage = new HttpWebRequestMessage(new Uri(serviceFixture.ServiceBaseUri.AbsoluteUri + "SimplePeopleSet(" + (PersonIdBase++) + ")", UriKind.Absolute));
                requestMessage.Method = "PATCH";

                var peopleEntry = new ODataResource()
                {
                    Properties = new[]
                    {
                        new ODataProperty {
                            Name = "MiddleName", Value = "NewMiddleName"
                        }
                    },
                };

                using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings))
                {
                    var odataWriter = messageWriter.CreateODataResourceWriter();
                    odataWriter.WriteStart(peopleEntry);
                    odataWriter.WriteEnd();
                }
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(204, responseMessage.StatusCode);
            }
        }
コード例 #27
0
        private static string GetWriterOutput(ODataResource entry, EdmModel model, IEdmEntitySetBase entitySet, EdmEntityType entityType, IServiceProvider container)
        {
            var outputStream = new MemoryStream();
            IODataResponseMessage message = new InMemoryMessage
            {
                Stream    = outputStream,
                Container = container
            };

            message.SetHeader("Content-Type", "application/json");
            var settings = new ODataMessageWriterSettings();

            settings.SetServiceDocumentUri(new Uri("http://test"));

            using (var messageWriter = new ODataMessageWriter(message, settings, model))
            {
                var writer = messageWriter.CreateODataResourceWriter(entitySet, entityType);
                writer.WriteStart(entry);
                writer.WriteEnd();
                outputStream.Seek(0, SeekOrigin.Begin);
                return(new StreamReader(outputStream).ReadToEnd());
            }
        }
コード例 #28
0
        private void WriteEntry()
        {
            var asyncWriter = this.CreateAsyncWriter();

            var innerMessage = asyncWriter.CreateResponseMessage();

            innerMessage.StatusCode = 200;
            innerMessage.SetHeader("Content-Type", "application/json");

            var settings = new ODataMessageWriterSettings();

            settings.SetServiceDocumentUri(new Uri(ServiceDocumentUri));
            settings.EnableMessageStreamDisposal = false;

            using (var innerMessageWriter = new ODataMessageWriter(innerMessage, settings, userModel))
            {
                var entryWriter = innerMessageWriter.CreateODataResourceWriter(singleton, testType);
                entryWriter.WriteStart(entry);
                entryWriter.WriteEnd();
            }

            asyncWriter.Flush();
        }
コード例 #29
0
        public void WriteEntryWithWrongSerializationInfoWithModel()
        {
            bool[] autoComputeMetadataBools = new bool[] { true, false, };
            foreach (var mimeType in this.testMimeTypes)
            {
                foreach (var autoComputeMetadata in autoComputeMetadataBools)
                {
                    var settings = new ODataMessageWriterSettings();
                    settings.ODataUri = new ODataUri()
                    {
                        ServiceRoot = this.ServiceUri
                    };

                    var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream());
                    responseMessageWithoutModel.SetHeader("Content-Type", mimeType);
                    using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings, WritePayloadHelper.Model))
                    {
                        var odataWriter = messageWriter.CreateODataResourceWriter(WritePayloadHelper.PersonSet, WritePayloadHelper.PersonType);
                        var entry       = this.CreatePersonEntryWithoutSerializationInfo();

                        entry.SetSerializationInfo(new ODataResourceSerializationInfo()
                        {
                            NavigationSourceName = "Parsen", NavigationSourceEntityTypeName = NameSpace + "Person"
                        });
                        odataWriter.WriteStart(entry);
                        odataWriter.WriteEnd();
                        var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream());
                        Assert.IsTrue(result.Contains("\"PersonId\":-5"));
                        if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                        {
                            // no metadata does not write odata.metadata
                            Assert.IsTrue(result.Contains("$metadata#Parsen/$entity"));
                        }
                    }
                }
            }
        }
コード例 #30
0
        private string WriterEntry(IEdmModel userModel, ODataResource entry, EdmEntitySet entitySet, IEdmEntityType entityType, bool fullMetadata = false, Action <ODataWriter> writeAction = null)
        {
            var message = new InMemoryMessage()
            {
                Stream = new MemoryStream()
            };

            var writerSettings = new ODataMessageWriterSettings {
                EnableMessageStreamDisposal = false
            };

            writerSettings.SetContentType(ODataFormat.Json);
            writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com"));
            writerSettings.SetContentType(fullMetadata ?
                                          "application/json;odata.metadata=full;odata.streaming=false" :
                                          "application/json;odata.metadata=minimal;odata.streaming=false", "utf-8");

            using (var msgReader = new ODataMessageWriter((IODataResponseMessage)message, writerSettings, userModel))
            {
                var writer = msgReader.CreateODataResourceWriter(entitySet, entityType);
                if (writeAction != null)
                {
                    writeAction(writer);
                }
                else
                {
                    writer.WriteStart(entry);
                    writer.WriteEnd();
                }
            }

            message.Stream.Seek(0, SeekOrigin.Begin);
            using (StreamReader reader = new StreamReader(message.Stream))
            {
                return(reader.ReadToEnd());
            }
        }