/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } if (readContext.Path == null) { throw Error.Argument("readContext", SRResources.ODataPathMissing); } IEdmEntitySet entitySet = GetEntitySet(readContext.Path); if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringDeserialization); } ODataReader odataReader = messageReader.CreateODataEntryReader(entitySet, EntityType.EntityDefinition()); ODataEntryWithNavigationLinks topLevelEntry = ReadEntryOrFeed(odataReader) as ODataEntryWithNavigationLinks; Contract.Assert(topLevelEntry != null); return ReadInline(topLevelEntry, readContext); }
private ODataEntry QueryEntry(string uri, string mimeType) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; var queryRequestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + uri, UriKind.Absolute)); queryRequestMessage.SetHeader("Accept", mimeType); var queryResponseMessage = queryRequestMessage.GetResponse(); Assert.AreEqual(200, queryResponseMessage.StatusCode); ODataEntry entry = null; if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(queryResponseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entry = reader.Item as ODataEntry; } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } return(entry); }
public void EntryTypeDefinedInReferencedModel() { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "VehicleGPSSet('VehicleKey2')", UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.AreEqual("VehicleKey2", entry.Properties.Single(p => p.Name == "Key").Value); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
public void TypeCastEntryinCycleReferencingModels() { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "VehicleGPSSetInGPS('DerivedVehicleGPSInGPSKey3')/Microsoft.OData.SampleService.Models.ModelRefDemo.TruckDemo.DerivedVehicleGPSType", UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.AreEqual("DerivedVehicleGPSInGPSKey3", entry.Properties.Single(p => p.Name == "Key").Value); Assert.AreEqual("DerivedVehicleGPSInGPSDP", entry.Properties.Single(p => p.Name == "DisplayName").Value); Assert.AreEqual(entry.TypeName, string.Format("{0}.TruckDemo.DerivedVehicleGPSType", TestModelNameSpace)); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
public void ReadCompletedAsyncResponse() { string payload = "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}"; var asyncReader = this.CreateAsyncReader(payload); var asyncResponse = asyncReader.CreateResponseMessage(); Assert.Equal(200, asyncResponse.StatusCode); Assert.Equal("application/json", asyncResponse.GetHeader("Content-Type")); Assert.Equal("4.0", asyncResponse.GetHeader("OData-Version")); using (var innerMessageReader = new ODataMessageReader(asyncResponse, new ODataMessageReaderSettings(), userModel)) { var reader = innerMessageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.Equal(1, entry.Properties.Single(p => p.Name == "Id").Value); } } } }
public void QueryEntityContainsDateAndTimeOfDay() { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Orders(7)", UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; // Verify Date Property Assert.AreEqual(new Date(2014, 8, 31), entry.Properties.Single(p => p.Name == "ShipDate").Value); Assert.AreEqual(new TimeOfDay(12, 40, 5, 50), entry.Properties.Single(p => p.Name == "ShipTime").Value); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
public void QueryEntityInstance() { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Customers(1)", UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.AreEqual(new TimeSpan(1), entry.Properties.Single(p => p.Name == "TimeBetweenLastTwoOrders").Value); } } } } } }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } if (readContext.Path == null) { throw Error.Argument("readContext", SRResources.ODataPathMissing); } IEdmEntitySet entitySet = GetEntitySet(readContext.Path); if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringDeserialization); } ODataReader odataReader = messageReader.CreateODataEntryReader(entitySet, EntityType.EntityDefinition()); ODataEntryWithNavigationLinks topLevelEntry = ReadEntryOrFeed(odataReader) as ODataEntryWithNavigationLinks; Contract.Assert(topLevelEntry != null); return(ReadInline(topLevelEntry, readContext)); }
/// <summary> /// Specifically use to query single entry or multi entries(query with $expand) /// </summary> /// <param name="requestUri"></param> /// <param name="mimeType"></param> /// <returns></returns> public List <ODataEntry> QueryEntries(string requestUri, string mimeType) { List <ODataEntry> entries = new List <ODataEntry>(); ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); requestMessage.SetHeader("Prefer", string.Format("{0}={1}", IncludeAnnotation, "*")); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entries.Add(reader.Item as ODataEntry); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } return(entries); }
private static void ReadOdataEntity(TableResult result, TableOperation operation, IODataResponseMessage respMsg, OperationContext ctx, ODataMessageReaderSettings readerSettings, string accountName, TableRequestOptions options) { using (ODataMessageReader messageReader = new ODataMessageReader(respMsg, readerSettings, new TableStorageModel(accountName))) { // create a reader ODataReader reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = (ODataEntry)reader.Item; if (operation.OperationType == TableOperationType.Retrieve) { result.Result = ReadAndResolve(entry, operation.RetrieveResolver, options); result.Etag = entry.ETag; } else { result.Etag = ReadAndUpdateTableEntity( operation.Entity, entry, EntityReadFlags.Timestamp | EntityReadFlags.Etag, ctx); } } } DrainODataReader(reader); } }
public static ODataEntry ReadODataEntry(EdmModel model, Stream stream) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceRootUri }; var responseMessage = new ODataResponseMessage(stream); using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: ODataEntry entry = reader.Item as ODataEntry; return(entry); } } } return(null); }
public ODataFeed QueryInnerFeed(string requestUri, string mimeType) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.FeedEnd) { return(reader.Item as ODataFeed); } } } } return(null); }
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, DisableMessageStreamDisposal = true}; writerSettings.ODataUri = new ODataUri() {ServiceRoot = new Uri("http://christro.svc/")}; var messageWriter = new ODataMessageWriter((IODataResponseMessage)writerRequestMemoryMessage, writerSettings, this.model); var organizationSetWriter = messageWriter.CreateODataEntryWriter(this.organizationsSet); var odataEntry = new ODataEntry(){ 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, DisableMessageStreamDisposal = true}, this.model); var organizationReader = messageReader.CreateODataEntryReader(this.organizationsSet, this.organizationsSet.EntityType()); organizationReader.Read().Should().Be(true); organizationReader.Item.As<ODataEntry>(); }
private ODataItem QueryEntityItem(string uri, int expectedStatusCode = 200) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; var queryRequestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + uri, UriKind.Absolute)); queryRequestMessage.SetHeader("Accept", MimeTypes.ApplicationJsonLight); var queryResponseMessage = queryRequestMessage.GetResponse(); Assert.AreEqual(expectedStatusCode, queryResponseMessage.StatusCode); ODataItem item = null; if (expectedStatusCode == 200) { using (var messageReader = new ODataMessageReader(queryResponseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { item = reader.Item; } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } return(item); }
public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage, bool includeResourceTypeInEntryProperties = false) #endif { var readerSettings = new ODataMessageReaderSettings(); readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue; using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model)) { var payloadKind = messageReader.DetectPayloadKind(); if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error)) { return(ODataResponse.FromStatusCode(responseMessage.StatusCode)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value)) { if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { throw new NotImplementedException(); } else { #if SILVERLIGHT var text = Utils.StreamToString(responseMessage.GetStream()); #else var text = Client.Utils.StreamToString(await responseMessage.GetStreamAsync()); #endif return(ODataResponse.FromFeed(new[] { new Dictionary <string, object>() { { FluentCommand.ResultLiteral, text } } })); } } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch)) { return(await ReadResponse(messageReader.CreateODataBatchReader(), includeResourceTypeInEntryProperties)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed)) { return(ReadResponse(messageReader.CreateODataFeedReader(), includeResourceTypeInEntryProperties)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { return(ReadResponse(messageReader.CreateODataCollectionReader(), includeResourceTypeInEntryProperties)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property)) { var property = messageReader.ReadProperty(); return(ODataResponse.FromFeed(new[] { new Dictionary <string, object>() { { property.Name ?? FluentCommand.ResultLiteral, GetPropertyValue(property.Value) } } })); } else { return(ReadResponse(messageReader.CreateODataEntryReader(), includeResourceTypeInEntryProperties)); } } }
/// <summary> /// Read the response message and perform given verifications /// </summary> /// <param name="isFeed">Whether the response has a feed</param> /// <param name="responseMessage">The response message</param> /// <param name="expectedSet">Expected IEdmEntitySet</param> /// <param name="expectedType">Expected IEdmEntityType</param> /// <param name="verifyFeed">Action to verify the feed</param> /// <param name="verifyEntry">Action to verify the entry</param> /// <param name="verifyNavigation">Action to verify the navigation</param> public static void ReadAndVerifyFeedEntryMessage(bool isFeed, StreamResponseMessage responseMessage, IEdmEntitySet expectedSet, IEdmEntityType expectedType, Action <ODataFeed> verifyFeed, Action <ODataEntry> verifyEntry, Action <ODataNavigationLink> verifyNavigation) { var settings = new ODataMessageReaderSettings() { BaseUri = ServiceUri }; settings.ShouldIncludeAnnotation = s => true; ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, Model); ODataReader reader = isFeed ? messageReader.CreateODataFeedReader(expectedSet, expectedType) : messageReader.CreateODataEntryReader(expectedSet, expectedType); while (reader.Read()) { switch (reader.State) { case ODataReaderState.FeedEnd: { if (verifyFeed != null) { verifyFeed((ODataFeed)reader.Item); } break; } case ODataReaderState.EntryEnd: { if (verifyEntry != null) { verifyEntry((ODataEntry)reader.Item); } break; } case ODataReaderState.NavigationLinkEnd: { if (verifyNavigation != null) { verifyNavigation((ODataNavigationLink)reader.Item); } break; } } } Assert.AreEqual(ODataReaderState.Completed, reader.State); }
/// <summary> /// Creates and Wraps an ODataReader for feeds or entries. /// </summary> /// <param name="messageReader">The message reader.</param> /// <param name="messageType">The message type.</param> /// <param name="expectedType">The expected EDM type.</param> /// <param name="responsePipeline">The data service response pipeling configuration object.</param> /// <returns>A reader.</returns> internal static ODataReaderWrapper Create(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceClientResponsePipelineConfiguration responsePipeline) { IEdmEntityType entityType = expectedType as IEdmEntityType; if (messageType == ODataPayloadKind.Entry) { return(new ODataReaderWrapper(messageReader.CreateODataEntryReader(entityType), responsePipeline)); } return(new ODataReaderWrapper(messageReader.CreateODataFeedReader(entityType), responsePipeline)); }
public void ActionTakeDateAndTimeAsParameter() { var writerSettings = new ODataMessageWriterSettings(); writerSettings.PayloadBaseUri = ServiceBaseUri; var readerSettings = new ODataMessageReaderSettings(); readerSettings.BaseUri = ServiceBaseUri; foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "Orders(7)/Microsoft.Test.OData.Services.ODataWCFService.ChangeShipTimeAndDate")); requestMessage.SetHeader("Content-Type", mimeType); requestMessage.SetHeader("Accept", mimeType); requestMessage.Method = "POST"; Date newDate = Date.MinValue; TimeOfDay newTime = TimeOfDay.MinValue; using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings, Model)) { var odataWriter = messageWriter.CreateODataParameterWriter((IEdmOperation)null); odataWriter.WriteStart(); odataWriter.WriteValue("date", newDate); odataWriter.WriteValue("time", newTime); odataWriter.WriteEnd(); } // send the http request var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.AreEqual(Date.MinValue, entry.Properties.Single(p => p.Name == "ShipDate").Value); Assert.AreEqual(TimeOfDay.MinValue, entry.Properties.Single(p => p.Name == "ShipTime").Value); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
public void TestCreateODataEntryReader_InJsonLight_WithoutEntitySetOrType_Throws() { // Arrange IODataRequestMessage request = CreateJsonLightRequest(); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.Throws <ODataException>(() => reader.CreateODataEntryReader()); } }
public void TestCreateODataEntryReader_InJsonLight_WithoutEntitySetOrType_Throws() { // Arrange IODataRequestMessage request = CreateJsonLightRequest(); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.Throws<ODataException>(() => reader.CreateODataEntryReader()); } }
public void QueryEntityNavigationWithImplicitKeys() { // test Uri's List <string> testCases = new List <string> { "Products(5)/Details(3)", "Products(5)/Details(ProductDetailID=3)", "Products(5)/Details(ProductID=5,ProductDetailID=3)", "ProductDetails(ProductID=5,ProductDetailID=2)/Reviews(ReviewTitle='So so',RevisionID=1)", "ProductDetails(ProductID=5,ProductDetailID=2)/Reviews(ProductDetailID=2,ReviewTitle='So so',RevisionID=1)", "ProductDetails(ProductID=5,ProductDetailID=2)/Reviews(ProductDetailID=2,RevisionID=1,ProductID=5,ReviewTitle='So so')", }; ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var testCase in testCases) { foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { ODataEntry entry = null; using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entry = reader.Item as ODataEntry; } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } Assert.IsTrue(entry.Id.OriginalString.EndsWith("ProductDetails(ProductID=5,ProductDetailID=3)") || entry.Id.OriginalString.EndsWith("ProductReviews(ProductID=5,ProductDetailID=2,ReviewTitle='So%20so',RevisionID=1)")); } } } }
public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage) { var readerSettings = new ODataMessageReaderSettings(); if (_session.Settings.IgnoreUnmappedProperties) { readerSettings.UndeclaredPropertyBehaviorKinds = ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty; } readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue; readerSettings.ShouldIncludeAnnotation = x => _session.Settings.IncludeAnnotationsInResults; using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model)) { var payloadKind = messageReader.DetectPayloadKind(); if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error)) { return(ODataResponse.FromStatusCode(responseMessage.StatusCode)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value)) { if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { throw new NotImplementedException(); } else { return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync().ConfigureAwait(false), responseMessage is ODataBatchOperationResponseMessage)); } } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch)) { return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed)) { return(ReadResponse(messageReader.CreateODataFeedReader())); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { return(ReadResponse(messageReader.CreateODataCollectionReader())); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property)) { var property = messageReader.ReadProperty(); return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value))); } else { return(ReadResponse(messageReader.CreateODataEntryReader())); } } }
public void ComplexTypeInstanceAnnotation() { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var mimeType in TestMimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "People(1)", UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); requestMessage.SetHeader("Prefer", string.Format("{0}={1}", IncludeAnnotation, "*")); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; // Get Value of Complex Type Property HomeAddress var complexValue = entry.Properties.Single(p => p.Name.Equals("HomeAddress")).Value as ODataComplexValue; // Verify Annotation on Complex Type ODataInstanceAnnotation annotationOnHomeAddress = complexValue.InstanceAnnotations.SingleOrDefault(); Assert.AreEqual(string.Format("{0}.AddressType", TestModelNameSpace), annotationOnHomeAddress.Name); Assert.AreEqual("Home", (annotationOnHomeAddress.Value as ODataPrimitiveValue).Value); // Verify Annotation on Property in Complex Type ODataInstanceAnnotation annotationOnCity = complexValue.Properties.SingleOrDefault(p => p.Name.Equals("City")).InstanceAnnotations.SingleOrDefault(); Assert.AreEqual(string.Format("{0}.CityInfo", TestModelNameSpace), annotationOnCity.Name); Assert.AreEqual(2, (annotationOnCity.Value as ODataComplexValue).Properties.Count()); // Verify Annotation on Property of Entity ODataInstanceAnnotation annotationonEmails = entry.Properties.SingleOrDefault(p => p.Name.Equals("Emails")).InstanceAnnotations.SingleOrDefault(); Assert.AreEqual(string.Format("{0}.DisplayName", TestModelNameSpace), annotationonEmails.Name); Assert.AreEqual("EmailAddresses", (annotationonEmails.Value as ODataPrimitiveValue).Value); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
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, DisableMessageStreamDisposal = true }; writerSettings.ODataUri = new ODataUri() { ServiceRoot = new Uri("http://christro.svc/") }; var messageWriter = new ODataMessageWriter((IODataResponseMessage)writerRequestMemoryMessage, writerSettings, this.model); var organizationSetWriter = messageWriter.CreateODataEntryWriter(this.organizationsSet); var odataEntry = new ODataEntry() { 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, DisableMessageStreamDisposal = true }, this.model); var organizationReader = messageReader.CreateODataEntryReader(this.organizationsSet, this.organizationsSet.EntityType()); organizationReader.Read().Should().Be(true); organizationReader.Item.As <ODataEntry>(); }
public void TestCreateODataEntryReader_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow() { // Arrange IODataRequestMessage request = CreateJsonLightRequest(); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => reader.CreateODataEntryReader(entitySet, null)); } }
public void ModelReferenceWithExpandOption() { Dictionary <string, int[]> testCases = new Dictionary <string, int[]>() { { "Trucks('Key1')?$select=Key,VehicleGPS&$expand=VehicleGPS", new int[] { 2, 1 } }, { "Trucks('Key1')?$expand=HeadUnit,VehicleGPS", new int[] { 3, 4 } }, }; ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var testCase in testCases) { foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { List <ODataEntry> entries = new List <ODataEntry>(); List <ODataNavigationLink> navigationLinks = new List <ODataNavigationLink>(); var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entries.Add(reader.Item as ODataEntry); } else if (reader.State == ODataReaderState.NavigationLinkEnd) { navigationLinks.Add(reader.Item as ODataNavigationLink); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); Assert.AreEqual(testCase.Value[0], entries.Count); Assert.AreEqual(testCase.Value[1], navigationLinks.Count); } } } } }
public void TestCreateODataEntryReader_InJsonLight_WithEntityTypeButWithoutSet_Throws() { // Arrange IODataRequestMessage request = CreateJsonLightRequest(); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); IEdmEntityType entityType = model.EntityContainer.EntitySets().First().EntityType(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.Throws<ODataException>(() => reader.CreateODataEntryReader(null, entityType)); } }
public void TestCreateODataEntryReader_InJsonLight_WithEntityTypeButWithoutSet_Throws() { // Arrange IODataRequestMessage request = CreateJsonLightRequest(); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); IEdmEntityType entityType = model.EntityContainer.EntitySets().First().EntityType(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.Throws <ODataException>(() => reader.CreateODataEntryReader(null, entityType)); } }
protected static ODataReader CreateODataReader(ODataMessageReader messageReader, ODataPayloadKind messageType, IEdmType expectedType, DataServiceProtocolVersion protocolVersion) { if (expectedType != null) { ClientEdmModel.GetModel(protocolVersion).GetClientTypeAnnotation(expectedType).EnsureEPMLoaded(); } IEdmEntityType expectedEntityType = expectedType as IEdmEntityType; if (messageType == ODataPayloadKind.Entry) { return(messageReader.CreateODataEntryReader(expectedEntityType)); } return(messageReader.CreateODataFeedReader(expectedEntityType)); }
/// <summary> /// Read the response message and perform given verifications /// </summary> /// <param name="isFeed">Whether the response has a feed</param> /// <param name="responseMessage">The response message</param> /// <param name="expectedSet">Expected IEdmEntitySet</param> /// <param name="expectedType">Expected IEdmEntityType</param> /// <param name="verifyFeed">Action to verify the feed</param> /// <param name="verifyEntry">Action to verify the entry</param> /// <param name="verifyNavigation">Action to verify the navigation</param> public static void ReadAndVerifyFeedEntryMessage(bool isFeed, StreamResponseMessage responseMessage, IEdmEntitySet expectedSet, IEdmEntityType expectedType, Action<ODataFeed> verifyFeed, Action<ODataEntry> verifyEntry, Action<ODataNavigationLink> verifyNavigation) { var settings = new ODataMessageReaderSettings() { BaseUri = ServiceUri }; settings.ShouldIncludeAnnotation = s => true; ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, Model); ODataReader reader = isFeed ? messageReader.CreateODataFeedReader(expectedSet, expectedType) : messageReader.CreateODataEntryReader(expectedSet, expectedType); while (reader.Read()) { switch (reader.State) { case ODataReaderState.FeedEnd: { if (verifyFeed != null) { verifyFeed((ODataFeed)reader.Item); } break; } case ODataReaderState.EntryEnd: { if (verifyEntry != null) { verifyEntry((ODataEntry)reader.Item); } break; } case ODataReaderState.NavigationLinkEnd: { if (verifyNavigation != null) { verifyNavigation((ODataNavigationLink)reader.Item); } break; } } } Assert.AreEqual(ODataReaderState.Completed, reader.State); }
public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage) { var readerSettings = new ODataMessageReaderSettings(); readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue; using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model)) { var payloadKind = messageReader.DetectPayloadKind(); if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error)) { return(ODataResponse.FromStatusCode(responseMessage.StatusCode)); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value)) { if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { throw new NotImplementedException(); } else { return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync())); } } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch)) { return(await ReadResponse(messageReader.CreateODataBatchReader())); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed)) { return(ReadResponse(messageReader.CreateODataFeedReader())); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { return(ReadResponse(messageReader.CreateODataCollectionReader())); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property)) { var property = messageReader.ReadProperty(); return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value))); } else { return(ReadResponse(messageReader.CreateODataEntryReader())); } } }
public override object Read(ODataMessageReader messageReader, ODataDeserializerReadContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } ODataReader odataReader = messageReader.CreateODataEntryReader(EdmEntityType.EntityDefinition()); ODataEntry topLevelEntry = ReadEntry(odataReader, EdmEntityType, readContext); return(ReadInline(topLevelEntry, readContext)); }
private void ReadEntryPayload(string payload, Action <ODataReader> action) { var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) }; message.SetHeader("Content-Type", "application/atom+xml;type=entry"); using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, atomReaderSettings)) { var reader = msgReader.CreateODataEntryReader(); while (reader.Read()) { action(reader); } } }
public static void Deserialize(this ITableEntity entity, byte[] value) { MemoryStream ms = new MemoryStream(value); using (ODataMessageReader messageReader = new ODataMessageReader(new Message(ms), new ODataMessageReaderSettings() { MessageQuotas = new ODataMessageQuotas() { MaxReceivedMessageSize = 20 * 1024 * 1024 } })) { ODataReader reader = messageReader.CreateODataEntryReader(); reader.Read(); TableOperationHttpWebRequestFactory.ReadAndUpdateTableEntity(entity, (ODataEntry)reader.Item, null); } }
public void ModelReferenceWithSelectOption() { Dictionary <string, int> testCases = new Dictionary <string, int>() { { "Trucks('Key1')?$select=Key,FuelLevel", 2 }, { "DerivedVehicleGPSSet('VehicleKey4')?$select=DisplayName,Map,StartLocation", 3 }, { "VehicleGPSSetInGPS('DerivedVehicleGPSInGPSKey3')/Microsoft.OData.SampleService.Models.ModelRefDemo.TruckDemo.DerivedVehicleGPSType?$select=DisplayName,Map,StartLocation", 3 } }; ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var testCase in testCases) { foreach (var mimeType in mimeTypes) { var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model)) { ODataEntry entry = new ODataEntry(); var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entry = reader.Item as ODataEntry; } } Assert.AreEqual(ODataReaderState.Completed, reader.State); Assert.AreEqual(testCase.Value, entry.Properties.Count()); } } } } }
// Simple demo for reading entry public static void ReadEntry(bool enableFullValidation) { var message = new Message() { Stream = Payloads.GetStreamFromResource("ODataSamples.Common.Payload.Entry.txt") }; ODataEntry entry = null; var setting = new ODataMessageReaderSettings() { EnableFullValidation = enableFullValidation, ShouldIncludeAnnotation = _ => true, }; using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, setting, ExtModel.Model)) { var reader = messageReader.CreateODataEntryReader(ExtModel.Person); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: entry = (ODataEntry)reader.Item; break; } } } Console.WriteLine("Id: {0}", entry.Id); Console.WriteLine("properties:"); foreach (var property in entry.Properties) { Console.WriteLine("{0}:{1}", property.Name, property.Value); } Console.WriteLine("Annotations:"); foreach (var annotation in entry.InstanceAnnotations) { Console.WriteLine("{0}:{1}", annotation.Name, annotation.Value); } }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } if (readContext.Path == null) { throw Error.Argument("readContext", SRResources.ODataPathMissing); } IEdmNavigationSource navigationSource = readContext.Path.NavigationSource; if (navigationSource == null) { throw new SerializationException(SRResources.NavigationSourceMissingDuringDeserialization); } IEdmTypeReference edmType = readContext.GetEdmType(type); Contract.Assert(edmType != null); if (!edmType.IsEntity()) { throw Error.Argument("type", SRResources.ArgumentMustBeOfType, EdmTypeKind.Entity); } IEdmEntityTypeReference entityType = edmType.AsEntity(); ODataReader odataReader = messageReader.CreateODataEntryReader(navigationSource, entityType.EntityDefinition()); ODataEntryWithNavigationLinks topLevelEntry = ReadEntryOrFeed(odataReader) as ODataEntryWithNavigationLinks; Contract.Assert(topLevelEntry != null); return ReadInline(topLevelEntry, entityType, readContext); }
public static List<CustomInstanceAnnotationsDescriptor> ReadFeedOrEntry(bool isFeed, Uri uri, string contentType, ODataMessageReaderSettings readerSettings, IEdmModel model) { var annotationsStack = new Stack<CustomInstanceAnnotationsDescriptor>(); var allAnnotations = new List<CustomInstanceAnnotationsDescriptor>(); var responseMessage = GetResponseMessge(uri, contentType); using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = isFeed ? messageReader.CreateODataFeedReader() : messageReader.CreateODataEntryReader(); while (reader.Read()) { switch (reader.State) { case ODataReaderState.FeedStart: case ODataReaderState.EntryStart: { var instanceAnnotations = GetItemInstanceAnnotations(reader); var parent = annotationsStack.Count == 0 ? null : annotationsStack.Peek(); var current = new CustomInstanceAnnotationsDescriptor { TypeOfAnnotatedItem = reader.Item.GetType(), Parent = parent, AnnotationsOnStart = instanceAnnotations }; annotationsStack.Push(current); allAnnotations.Add(current); break; } case ODataReaderState.FeedEnd: case ODataReaderState.EntryEnd: { var instanceAnnotations = GetItemInstanceAnnotations(reader); var current = annotationsStack.Pop(); current.AnnotationsOnEnd = instanceAnnotations; break; } } } } return allAnnotations; }
private void ReadEntryPayload(string payload, Action<ODataReader> action) { var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) }; message.SetHeader("Content-Type", "application/atom+xml;type=entry"); ODataMessageReaderSettings settings = new ODataMessageReaderSettings { EnableAtom = true }; using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, settings)) { var reader = msgReader.CreateODataEntryReader(); while (reader.Read()) { action(reader); } } }
public void ReadingInMinialMetadataModeWithContainedNonCollectionEntitySetOfAnotherTypeShouldBeAbleToGenerateId() { const string payload = "{" + "\"@odata.context\":\"http://example.com/$metadata#EntitySet(1)/AnotherContainedNonCollectionNavProp/$entity\"," + "\"ID\" : 123," + "\"Name\" : \"Bob\"" + "}"; InMemoryMessage message = new InMemoryMessage(); message.SetHeader("Content-Type", "application/json;odata.metadata=minimal"); message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); ODataEntry topLevelEntry = null; List<ODataEntry> entryList = new List<ODataEntry>(); using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model)) { var navProp = EntityType.FindProperty("AnotherContainedNonCollectionNavProp") as IEdmNavigationProperty; var containedEntitySet = EntitySet.FindNavigationTarget(navProp) as IEdmEntitySetBase; var reader = messageReader.CreateODataEntryReader(containedEntitySet, AnotherEntityType); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: topLevelEntry = (ODataEntry)reader.Item; entryList.Add(topLevelEntry); break; } } } Uri containedId = new Uri("http://example.com/EntitySet(1)/AnotherContainedNonCollectionNavProp"); ODataEntry containedEntry = entryList[0]; containedEntry.Id.Should().Be(containedId); }
public void UnsignedIntAndTypeDefinitionRoundtripJsonLightIntegrationTest() { var model = new EdmModel(); var uint16 = new EdmTypeDefinition("MyNS", "UInt16", EdmPrimitiveTypeKind.Double); var uint16Ref = new EdmTypeDefinitionReference(uint16, false); model.AddElement(uint16); model.SetPrimitiveValueConverter(uint16Ref, UInt16ValueConverter.Instance); var uint64 = new EdmTypeDefinition("MyNS", "UInt64", EdmPrimitiveTypeKind.String); var uint64Ref = new EdmTypeDefinitionReference(uint64, false); model.AddElement(uint64); model.SetPrimitiveValueConverter(uint64Ref, UInt64ValueConverter.Instance); var guidType = new EdmTypeDefinition("MyNS", "Guid", EdmPrimitiveTypeKind.Int64); var guidRef = new EdmTypeDefinitionReference(guidType, true); model.AddElement(guidType); var personType = new EdmEntityType("MyNS", "Person"); personType.AddKeys(personType.AddStructuralProperty("ID", uint64Ref)); personType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); personType.AddStructuralProperty("FavoriteNumber", uint16Ref); personType.AddStructuralProperty("Age", model.GetUInt32("MyNS", true)); personType.AddStructuralProperty("Guid", guidRef); personType.AddStructuralProperty("Weight", EdmPrimitiveTypeKind.Double); personType.AddStructuralProperty("Money", EdmPrimitiveTypeKind.Decimal); model.AddElement(personType); var container = new EdmEntityContainer("MyNS", "Container"); var peopleSet = container.AddEntitySet("People", personType); model.AddElement(container); var stream = new MemoryStream(); IODataResponseMessage message = new InMemoryMessage { Stream = stream }; message.StatusCode = 200; var writerSettings = new ODataMessageWriterSettings(); writerSettings.SetServiceDocumentUri(new Uri("http://host/service")); var messageWriter = new ODataMessageWriter(message, writerSettings, model); var entryWriter = messageWriter.CreateODataEntryWriter(peopleSet); var entry = new ODataEntry { TypeName = "MyNS.Person", Properties = new[] { new ODataProperty { Name = "ID", Value = UInt64.MaxValue }, new ODataProperty { Name = "Name", Value = "Foo" }, new ODataProperty { Name = "FavoriteNumber", Value = (UInt16)250 }, new ODataProperty { Name = "Age", Value = (UInt32)123 }, new ODataProperty { Name = "Guid", Value = Int64.MinValue }, new ODataProperty { Name = "Weight", Value = 123.45 }, new ODataProperty { Name = "Money", Value = Decimal.MaxValue } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); entryWriter.Flush(); stream.Position = 0; StreamReader reader = new StreamReader(stream); string payload = reader.ReadToEnd(); payload.Should().Be("{\"@odata.context\":\"http://host/service/$metadata#People/$entity\",\"ID\":\"18446744073709551615\",\"Name\":\"Foo\",\"FavoriteNumber\":250.0,\"Age\":123,\"Guid\":-9223372036854775808,\"Weight\":123.45,\"Money\":79228162514264337593543950335}"); stream = new MemoryStream(Encoding.Default.GetBytes(payload)); message = new InMemoryMessage { Stream = stream }; message.StatusCode = 200; var readerSettings = new ODataMessageReaderSettings(); var messageReader = new ODataMessageReader(message, readerSettings, model); var entryReader = messageReader.CreateODataEntryReader(peopleSet, personType); Assert.True(entryReader.Read()); var entryReaded = entryReader.Item as ODataEntry; var propertiesReaded = entryReaded.Properties.ToList(); var propertiesGiven = entry.Properties.ToList(); Assert.Equal(propertiesReaded.Count, propertiesGiven.Count); for (int i = 0; i < propertiesReaded.Count; ++i) { Assert.Equal(propertiesReaded[i].Name, propertiesGiven[i].Name); Assert.Equal(propertiesReaded[i].Value.GetType(), propertiesGiven[i].Value.GetType()); Assert.Equal(propertiesReaded[i].Value, propertiesGiven[i].Value); } }
private object ProcessPostBody(IODataRequestMessage message, IEdmEntitySetBase entitySet, object queryResults) { object lastNewInstance = null; using (var messageReader = new ODataMessageReader(message, this.GetReaderSettings(), this.DataSource.Model)) { var odataItemStack = new Stack<ODataItem>(); var entryReader = messageReader.CreateODataEntryReader(entitySet, entitySet.EntityType()); var currentTargetEntitySet = entitySet; while (entryReader.Read()) { switch (entryReader.State) { case ODataReaderState.EntryStart: odataItemStack.Push(entryReader.Item); break; case ODataReaderState.EntryEnd: { var entry = (ODataEntry)entryReader.Item; // TODO: the code here will be changed to handle following scenarios // 1: non-contained navigation, e.g. People(1)/Friends // 2. general entity set, e.g. People // 3. contained navigation, e.g. People(1)/Trips // 4. upsert, e.g. People(1)/Friends(2) var newInstance = this.DataSource.UpdateProvider.Create(entry.TypeName, queryResults); foreach (var property in entry.Properties) { if (Utility.IsETagProperty(newInstance, property.Name)) continue; this.DataSource.UpdateProvider.Update(newInstance, property.Name, property.Value); } var boundNavPropAnnotation = odataItemStack.Pop().GetAnnotation<BoundNavigationPropertyAnnotation>(); if (boundNavPropAnnotation != null) { foreach (var boundProperty in boundNavPropAnnotation.BoundProperties) { var isCollection = boundProperty.Item1.IsCollection == true; var propertyValue = isCollection ? boundProperty.Item2 : ((IEnumerable<object>)boundProperty.Item2).Single(); this.DataSource.UpdateProvider.Update(newInstance, boundProperty.Item1.Name, propertyValue); } } var parentItem = odataItemStack.Count > 0 ? odataItemStack.Peek() : null; if (parentItem != null) { // This new entry belongs to a navigation property and/or feed - // propagate it up the tree for further processing. AddChildInstanceAnnotation(parentItem, newInstance); } lastNewInstance = newInstance; } break; case ODataReaderState.FeedStart: odataItemStack.Push(entryReader.Item); break; case ODataReaderState.FeedEnd: { var childAnnotation = odataItemStack.Pop().GetAnnotation<ChildInstanceAnnotation>(); var parentNavLink = odataItemStack.Count > 0 ? odataItemStack.Peek() as ODataNavigationLink : null; if (parentNavLink != null) { // This feed belongs to a navigation property - // propagate it up the tree for further processing. AddChildInstanceAnnotation(parentNavLink, childAnnotation.ChildInstances ?? new object[0]); } } break; case ODataReaderState.NavigationLinkStart: { odataItemStack.Push(entryReader.Item); var navigationLink = (ODataNavigationLink)entryReader.Item; var navigationProperty = (IEdmNavigationProperty)currentTargetEntitySet.EntityType().FindProperty(navigationLink.Name); // Current model implementation doesn't expose associations otherwise this would be much cleaner. currentTargetEntitySet = this.DataSource.Model.EntityContainer.EntitySets().Single(s => s.EntityType() == navigationProperty.Type.Definition); } break; case ODataReaderState.NavigationLinkEnd: { var navigationLink = (ODataNavigationLink)entryReader.Item; var childAnnotation = odataItemStack.Pop().GetAnnotation<ChildInstanceAnnotation>(); if (childAnnotation != null) { // Propagate the bound entries to the parent entry. AddBoundNavigationPropertyAnnotation(odataItemStack.Peek(), navigationLink, childAnnotation.ChildInstances); } } break; } } } return lastNewInstance; }
private void ReadEntryPayload(IEdmModel userModel, string payload, EdmEntitySet entitySet, IEdmEntityType entityType, Action<ODataReader> action, bool isIeee754Compatible = true) { var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) }; string contentType = isIeee754Compatible ? "application/json;odata.metadata=minimal;IEEE754Compatible=true" : "application/json;odata.metadata=minimal;IEEE754Compatible=false"; message.SetHeader("Content-Type", contentType); var readerSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = false }; using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, readerSettings, userModel)) { var reader = msgReader.CreateODataEntryReader(entitySet, entityType); while (reader.Read()) { action(reader); } } }
internal static object ConvertEntity(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { IEdmEntityTypeReference entityType = edmTypeReference.AsEntity(); EdmEntitySet tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp", entityType.EntityDefinition()); ODataReader entryReader = oDataMessageReader.CreateODataEntryReader(tempEntitySet, entityType.EntityDefinition()); object item = ODataEntityDeserializer.ReadEntryOrFeed(entryReader); ODataEntryWithNavigationLinks topLevelEntry = item as ODataEntryWithNavigationLinks; Contract.Assert(topLevelEntry != null); ODataEntityDeserializer entityDeserializer = (ODataEntityDeserializer)DeserializerProvider.GetEdmTypeDeserializer(entityType); object entity = entityDeserializer.ReadInline(topLevelEntry, entityType, readContext); return CovertEntityId(entity, topLevelEntry.Entry, entityType, readContext); }
/// <summary> /// Specifically use to query single entry or multi entries(query with $expand) /// </summary> /// <param name="requestUri"></param> /// <param name="mimeType"></param> /// <returns></returns> public List<ODataEntry> QueryEntries(string requestUri, string mimeType) { List<ODataEntry> entries = new List<ODataEntry>(); ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entries.Add(reader.Item as ODataEntry); } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } return entries; }
public async Task<ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage) { var readerSettings = new ODataMessageReaderSettings(); readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue; using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model)) { var payloadKind = messageReader.DetectPayloadKind(); if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error)) { return ODataResponse.FromStatusCode(responseMessage.StatusCode); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value)) { if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { throw new NotImplementedException(); } else { return ODataResponse.FromValueStream(await responseMessage.GetStreamAsync()); } } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch)) { return await ReadResponse(messageReader.CreateODataBatchReader()); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Feed)) { return ReadResponse(messageReader.CreateODataFeedReader()); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection)) { return ReadResponse(messageReader.CreateODataCollectionReader()); } else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property)) { var property = messageReader.ReadProperty(); return ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)); } else { return ReadResponse(messageReader.CreateODataEntryReader()); } } }
public void ReadingContainedWithSubContextUrlShouldThrow() { string payload = "{\"@odata.context\":\"http://example.org/odata.svc/$metadata#EntitySet(ID,Name,ExpandedNavProp,ContainedCollectionNavProp,ContainedNavProp,ContainedCollectionNavProp(ID),ContainedNavProp(ID,Name))/$entity\"," + "\"ID\":101,\"Name\":\"Alice\"," + "\"[email protected]\":\"http://example.org/odata.svc/navigation\"," + "\"ContainedCollectionNavProp\":[" + "{\"ID\":102,\"Name\":\"Bob\"}" + "]" + "}"; InMemoryMessage message = new InMemoryMessage(); message.SetHeader("Content-Type", "application/json;odata.metadata=minimal"); message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); List<ODataEntry> entryList = new List<ODataEntry>(); Action readContainedEntry = () => { using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: entryList.Add(reader.Item as ODataEntry); break; } } } foreach (var oDataEntry in entryList) { oDataEntry.Id.Should().NotBeNull(); } }; readContainedEntry.ShouldThrow<ODataException>().WithMessage(ErrorStrings.ODataMetadataBuilder_MissingODataUri); }
public void ReadingEntryExpandWithMixedCollectionAndNonCollectionContainedElementAtSameLevel() { string payload = "{\"@odata.context\":\"http://example.org/odata.svc/$metadata#EntitySet(ID,Name,ExpandedNavProp,ContainedCollectionNavProp,ContainedNavProp,ContainedCollectionNavProp(ID),ContainedNavProp(ID,Name))/$entity\"," + "\"ID\":101,\"Name\":\"Alice\"," + "\"ExpandedNavProp\":{\"ID\":102,\"Name\":\"Bob\"}," + "\"[email protected]\":\"http://example.org/odata.svc/$metadata#EntitySet(101)/ContainedCollectionNavProp(ID)\"," + "\"[email protected]\":\"http://example.org/odata.svc/navigation\"," + "\"ContainedCollectionNavProp\":[" + "{\"ID\":102,\"Name\":\"Bob\"}" + "]," + "\"[email protected]\":\"http://example.org/odata.svc/$metadata#EntitySet(101)/ContainedNavProp(ID,Name)/$entity\"," + "\"ContainedNavProp\":{\"ID\":103,\"Name\":\"Charlie\"}" + "}"; InMemoryMessage message = new InMemoryMessage(); message.SetHeader("Content-Type", "application/json;odata.metadata=minimal"); message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); List<ODataEntry> entryList = new List<ODataEntry>(); using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: entryList.Add(reader.Item as ODataEntry); break; } } } ODataEntry bobEntry = entryList[0]; ODataEntry containedBobEntry = entryList[1]; ODataEntry containedCharileEntry = entryList[2]; ODataEntry topLevelAliceEntry = entryList[3]; bobEntry.Id.Should().Be("http://example.org/odata.svc/EntitySet(102)"); containedBobEntry.Id.Should().Be("http://example.org/odata.svc/EntitySet(101)/ContainedCollectionNavProp(102)"); containedCharileEntry.Id.Should().Be("http://example.org/odata.svc/EntitySet(101)/ContainedNavProp"); topLevelAliceEntry.Id.Should().Be("http://example.org/odata.svc/EntitySet(101)"); }
private void ProcessUpdateRequestBody(IODataRequestMessage requestMessage, IODataResponseMessage responseMessage, object targetObject, bool isUpsert) { if (this.QueryContext.Target.NavigationSource != null && this.QueryContext.Target.TypeKind == EdmTypeKind.Entity) { using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings(), this.DataSource.Model)) { var entryReader = messageReader.CreateODataEntryReader(this.QueryContext.Target.NavigationSource, (IEdmEntityType)this.QueryContext.Target.Type); while (entryReader.Read()) { switch (entryReader.State) { case ODataReaderState.EntryEnd: var entry = (ODataEntry)entryReader.Item; foreach (var property in entry.Properties) { if (Utility.IsETagProperty(targetObject, property.Name)) continue; // the property might be an open property, so test null first var propertyInfo = targetObject.GetType().GetProperty(property.Name); if (propertyInfo != null) { if (!isUpsert && Utility.IsReadOnly(propertyInfo)) continue; } this.DataSource.UpdateProvider.Update(targetObject, property.Name, property.Value); } break; } } } } else if (this.QueryContext.Target.Property != null && this.QueryContext.Target.TypeKind == EdmTypeKind.Complex) { using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings(), this.DataSource.Model)) { var property = messageReader.ReadProperty(this.QueryContext.Target.Property); ODataComplexValue complexValue = property.Value as ODataComplexValue; foreach (var p in complexValue.Properties) { if (Utility.IsETagProperty(targetObject, property.Name)) continue; this.DataSource.UpdateProvider.Update(targetObject, p.Name, p.Value); } } } else { throw Utility.BuildException( HttpStatusCode.NotImplemented, string.Format("PATCH/PUT for '{0}' type is not supported.", this.QueryContext.Target.TypeKind), null); } var currentETag = Utility.GetETagValue(targetObject); // if the current entity has ETag field if (currentETag != null) { if (!isUpsert) { this.DataSource.UpdateProvider.UpdateETagValue(targetObject); } this.DataSource.UpdateProvider.SaveChanges(); currentETag = Utility.GetETagValue(targetObject); responseMessage.SetHeader(ServiceConstants.HttpHeaders.ETag, currentETag); } else { this.DataSource.UpdateProvider.SaveChanges(); } ResponseWriter.WriteEmptyResponse(responseMessage); }
private object ProcessPostBody(IncomingRequestMessage message, IEdmEntitySet entitySet) { object lastNewInstance = null; using (var messageReader = new ODataMessageReader(message, this.GetDefaultReaderSettings(), this.Model)) { var odataItemStack = new Stack<ODataItem>(); var entryReader = messageReader.CreateODataEntryReader(entitySet.EntityType()); IEdmEntitySet currentTargetEntitySet = entitySet; while (entryReader.Read()) { switch (entryReader.State) { case ODataReaderState.EntryStart: entryReader.Item.SetAnnotation(new TargetEntitySetAnnotation { TargetEntitySet = currentTargetEntitySet }); odataItemStack.Push(entryReader.Item); break; case ODataReaderState.EntryEnd: { var entry = (ODataEntry)entryReader.Item; var targetEntitySet = entry.GetAnnotation<TargetEntitySetAnnotation>().TargetEntitySet; object newInstance = this.DataContext.CreateNewItem(targetEntitySet); foreach (var property in entry.Properties) { DataContext.UpdatePropertyValue(newInstance, property.Name, property.Value); } var boundNavPropAnnotation = odataItemStack.Pop().GetAnnotation<BoundNavigationPropertyAnnotation>(); if (boundNavPropAnnotation != null) { foreach (var boundProperty in boundNavPropAnnotation.BoundProperties) { bool isCollection = boundProperty.Item1.IsCollection == true; object propertyValue = isCollection ? boundProperty.Item2 : ((IEnumerable<object>)boundProperty.Item2).Single(); DataContext.UpdatePropertyValue(newInstance, boundProperty.Item1.Name, propertyValue); } } var parentItem = odataItemStack.Count > 0 ? odataItemStack.Peek() : null; if (parentItem != null) { // This new entry belongs to a navigation property and/or feed - // propagate it up the tree for further processing. AddChildInstanceAnnotation(parentItem, newInstance); } this.DataContext.AddItem(targetEntitySet, newInstance); lastNewInstance = newInstance; } break; case ODataReaderState.FeedStart: odataItemStack.Push(entryReader.Item); break; case ODataReaderState.FeedEnd: { var childAnnotation = odataItemStack.Pop().GetAnnotation<ChildInstanceAnnotation>(); var parentNavLink = odataItemStack.Count > 0 ? odataItemStack.Peek() as ODataNavigationLink : null; if (parentNavLink != null) { // This feed belongs to a navigation property - // propagate it up the tree for further processing. AddChildInstanceAnnotation(parentNavLink, childAnnotation.ChildInstances ?? new object[0]); } } break; case ODataReaderState.NavigationLinkStart: { odataItemStack.Push(entryReader.Item); var navigationLink = (ODataNavigationLink)entryReader.Item; var navigationProperty = (IEdmNavigationProperty)currentTargetEntitySet.EntityType().FindProperty(navigationLink.Name); // Current model implementation doesn't expose associations otherwise this would be much cleaner. currentTargetEntitySet = this.Model.EntityContainer.EntitySets().Single(s => s.EntityType() == navigationProperty.Type.Definition); } break; case ODataReaderState.NavigationLinkEnd: { var navigationLink = (ODataNavigationLink)entryReader.Item; var childAnnotation = odataItemStack.Pop().GetAnnotation<ChildInstanceAnnotation>(); if (childAnnotation != null) { // Propagate the bound entries to the parent entry. AddBoundNavigationPropertyAnnotation(odataItemStack.Peek(), navigationLink, childAnnotation.ChildInstances); } } break; } } } return lastNewInstance; }
private static void ReadResponseEntryPayload(EdmModel userModel, string payload, EdmEntitySet entitySet, IEdmEntityType entityType, Action<ODataReader> action) { string contentType = "application/atom+xml;type=entry"; var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) }; message.SetHeader("Content-Type", contentType); var readerSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = false, EnableAtom = true }; using (var msgReader = new ODataMessageReader((IODataResponseMessage)message, readerSettings, userModel)) { var reader = msgReader.CreateODataEntryReader(entitySet, entityType); while (reader.Read()) { action(reader); } } }
private static ODataResult GetODataResult(ODataMessageReader messageReader) { List<ODataPayloadKindDetectionResult> payloadKinds = messageReader.DetectPayloadKind().ToList(); if (payloadKinds.Count > 0) { switch (payloadKinds[0].PayloadKind) { case ODataPayloadKind.Feed: return new FeedODataResult(messageReader.CreateODataFeedReader()); case ODataPayloadKind.Entry: return new FeedODataResult(messageReader.CreateODataEntryReader()); } throw new InvalidOperationException("unsupported payload kind " + payloadKinds[0].PayloadKind); } throw new InvalidOperationException("unknown payload kind"); }
public ODataFeed QueryInnerFeed(string requestUri, string mimeType) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.FeedEnd) { return (reader.Item as ODataFeed); } } } } return null; }
private object ProcessPutBody(IncomingRequestMessage message, IEdmEntitySet entitySet, IDictionary<string, object> entityKeys) { using (var messageReader = new ODataMessageReader(message, this.GetDefaultReaderSettings(), this.Model)) { var entryReader = messageReader.CreateODataEntryReader(entitySet.EntityType()); while (entryReader.Read()) { switch(entryReader.State) { case ODataReaderState.EntryEnd: var entry = (ODataEntry)entryReader.Item; foreach (var property in entry.Properties) { this.DataContext.UpdateItem(entitySet, entityKeys, property.Name, property.Value); } break; } } } return this.DataContext.GetItem(entitySet, entityKeys); }
private void PrimitiveValueAsKeyInURL(string keySegment) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = this.ServiceUri }; foreach (var mimeType in mimeTypes) { var requestMessage = new Microsoft.Test.OData.Tests.Client.Common.HttpWebRequestMessage(new Uri(this.ServiceUri.AbsoluteUri + keySegment, UriKind.Absolute)); requestMessage.SetHeader("Accept", mimeType); var responseMessage = requestMessage.GetResponse(); Assert.AreEqual(200, responseMessage.StatusCode); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, RetrieveServiceEdmModel())) { var reader = messageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { var expectedKeySegment = keySegment.Substring(0, keySegment.IndexOf("(")) + "(1)"; ODataEntry entry = reader.Item as ODataEntry; Assert.IsTrue(entry.Id.ToString().Contains(expectedKeySegment), "Expected : Entry's Id doesn't contain trailing when Key is Int64/float/double/decimal"); if (mimeType.Equals(MimeTypes.ApplicationJson + MimeTypes.ODataParameterFullMetadata)) { Assert.IsTrue(entry.EditLink.ToString().Contains(expectedKeySegment), "Expected : Entry's EditLink doesn't contain trailing when Key is Int64/float/double/decimal"); Assert.IsTrue(entry.ReadLink.ToString().Contains(expectedKeySegment), "Expected : Entry's ReadLink doesn't contain trailing when Key is Int64/float/double/decimal"); } } } Assert.AreEqual(ODataReaderState.Completed, reader.State); } } } }
private void ClientReadAsyncBatchResponse(byte[] responsePayload) { IODataResponseMessage responseMessage = new InMemoryMessage() { Stream = new MemoryStream(responsePayload) }; responseMessage.SetHeader("Content-Type", batchContentType); using (var messageReader = new ODataMessageReader(responseMessage, new ODataMessageReaderSettings(), this.userModel)) { var batchReader = messageReader.CreateODataBatchReader(); while (batchReader.Read()) { switch (batchReader.State) { case ODataBatchReaderState.Operation: // Encountered an operation (either top-level or in a changeset) var operationMessage = batchReader.CreateOperationResponseMessage(); if (operationMessage.StatusCode == 200) { using (ODataMessageReader innerMessageReader = new ODataMessageReader(operationMessage, new ODataMessageReaderSettings(), this.userModel)) { var reader = innerMessageReader.CreateODataEntryReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.AreEqual("ALFKI", entry.Properties.Single(p => p.Name == "Id").Value); Assert.AreEqual("John", entry.Properties.Single(p => p.Name == "Name").Value); } } } } else { Assert.AreEqual(202, operationMessage.StatusCode); } break; } } } }
private void CreateAndReadUnlimitedResponseMessageWithEntry(string startingString, string cycleString) { var model = this.GetModel(); if (model != null) { var responseMessage = new ODataUnlimitedResponseMessage(startingString, cycleString); responseMessage.SetHeader("Content-Type", "application/json"); responseMessage.SetHeader("DataServiceVersion", "3.0"); var readLimitReached = false; try { using (var messageReader = new ODataMessageReader(responseMessage, new ODataMessageReaderSettings(), model)) { var entryReader = messageReader.CreateODataEntryReader(); entryReader.Read(); var result = entryReader.Item; Console.WriteLine(result); } } catch (ODataException ex) { if (ex.Message.StartsWith("The maximum number of bytes allowed to be read from the stream has been exceeded.")) { readLimitReached = true; } else { throw; } } if (!readLimitReached) { throw new InvalidOperationException("Expecting exception, but it was not thrown."); } } }
public void ReadingInMinialMetadataModeWithExpandedNonCollectionContainedEntitySetAndTypeCastShouldBeAbleToGenerateId() { const string payload = "{" + "\"@odata.context\":\"http://example.com/$metadata#EntitySet(ContainedNonCollectionNavProp/Namespace.EntityType)/$entity\"," + "\"ID\" : 123," + "\"Name\" : \"Bob\"," + "\"[email protected]\":\"http://example.com/$metadata#EntitySet(123)/ContainedNonCollectionNavProp/Namespace.EntityType/$entity\"," + "\"ContainedNonCollectionNavProp\":" + "{" + "\"ID\" : 234," + "\"Name\" : \"Foo\"" + "}" + "}"; InMemoryMessage message = new InMemoryMessage(); message.SetHeader("Content-Type", "application/json;odata.metadata=minimal"); message.Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); ODataEntry topLevelEntry = null; List<ODataEntry> entryList = new List<ODataEntry>(); using (var messageReader = new ODataMessageReader((IODataResponseMessage)message, null, Model)) { var reader = messageReader.CreateODataEntryReader(EntitySet, EntityType); while (reader.Read()) { switch (reader.State) { case ODataReaderState.EntryEnd: topLevelEntry = (ODataEntry)reader.Item; entryList.Add(topLevelEntry); break; } } } Uri containedId = new Uri("http://example.com/EntitySet(123)/ContainedNonCollectionNavProp"); ODataEntry containedEntry = entryList[0]; containedEntry.Id.Should().Be(containedId); }