/// <summary> /// Determines the response format based on the results of content negotiation. /// </summary> /// <param name="payloadKind">The payload kind of the response.</param> /// <param name="acceptableMediaTypes"> /// The acceptable media types used to determine the content type of the message. /// This is a comma separated list of content types as specified in RFC 2616, Section 14.1 /// </param> /// <param name="acceptableCharSets"> /// The acceptable charsets to use to the determine the encoding of the message. /// This is a comma separated list of charsets as specified in RFC 2616, Section 14.2 /// </param> /// <returns>The format the response should use. </returns> internal ODataFormatWithParameters DetermineResponseFormat(ODataPayloadKind payloadKind, string acceptableMediaTypes, string acceptableCharSets) { Debug.Assert(payloadKind != ODataPayloadKind.Unsupported, "kind != ODataPayloadKind.Unsupported"); ContentNegotiationResponseMessage responseMessage = new ContentNegotiationResponseMessage(); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { Version = this.responseVersion }; settings.EnableAtomSupport(); settings.SetContentType(acceptableMediaTypes, acceptableCharSets); try { using (ODataMessageWriter writer = new ODataMessageWriter(responseMessage, settings)) { ODataFormat format = ODataUtils.SetHeadersForPayload(writer, payloadKind); return new ODataFormatWithParameters(format, responseMessage.ContentType); } } catch (ODataContentTypeException exception) { if (this.throwIfNoMatch) { throw new DataServiceException(415, null, Microsoft.OData.Service.Strings.DataServiceException_UnsupportedMediaType, null, exception); } return null; } }
public void WriteObject_WritesValueReturnedFrom_CreateODataCollectionValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataCollectionSerializer> serializer = new Mock<ODataCollectionSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "CollectionName", Model = _model }; IEnumerable enumerable = new object[0]; ODataCollectionValue collectionValue = new ODataCollectionValue { TypeName = "NS.Name", Items = new[] { 0, 1, 2 } }; serializer.CallBase = true; serializer .Setup(s => s.CreateODataCollectionValue(enumerable, It.Is<IEdmTypeReference>(e => e.Definition == _edmIntType.Definition), writeContext)) .Returns(collectionValue).Verifiable(); // Act serializer.Object.WriteObject(enumerable, typeof(int[]), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#Collection(Edm.Int32)\",\"value\":[0,1,2]}", result); }
public void ReadJsonLight() { // Arrange var deserializer = new ODataEntityReferenceLinkDeserializer(); MockODataRequestMessage requestMessage = new MockODataRequestMessage(); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(); writerSettings.SetContentType(ODataFormat.Json); IEdmModel model = CreateModel(); ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, writerSettings, model); messageWriter.WriteEntityReferenceLink(new ODataEntityReferenceLink { Url = new Uri("http://localhost/samplelink") }); ODataMessageReader messageReader = new ODataMessageReader(new MockODataRequestMessage(requestMessage), new ODataMessageReaderSettings(), model); IEdmNavigationProperty navigationProperty = GetNavigationProperty(model); ODataDeserializerContext context = new ODataDeserializerContext { Request = new HttpRequestMessage(), Path = new ODataPath(new NavigationPathSegment(navigationProperty)) }; // Act Uri uri = deserializer.Read(messageReader, typeof(Uri), context) as Uri; // Assert Assert.NotNull(uri); Assert.Equal("http://localhost/samplelink", uri.AbsoluteUri); }
public void WriteObject_WritesValueReturnedFrom_CreateODataCollectionValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataCollectionSerializer> serializer = new Mock<ODataCollectionSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "CollectionName", Model = _model }; IEnumerable enumerable = new object[0]; ODataCollectionValue collectionValue = new ODataCollectionValue { TypeName = "NS.Name", Items = new[] { 0, 1, 2 } }; serializer.CallBase = true; serializer .Setup(s => s.CreateODataCollectionValue(enumerable, It.Is<IEdmTypeReference>(e => e.Definition == _edmIntType.Definition), writeContext)) .Returns(collectionValue).Verifiable(); // Act serializer.Object.WriteObject(enumerable, typeof(int[]), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("value", element.Name.LocalName); Assert.Equal(3, element.Descendants().Count()); Assert.Equal(new[] { "0", "1", "2" }, element.Descendants().Select(e => e.Value)); }
public void CreateCollectionWriterWithoutTypeShouldPassForJsonLight() { var settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Json); var writer = new ODataMessageWriter(new DummyRequestMessage(), settings, new EdmModel()); writer.CreateODataCollectionWriter(null).Should().BeOfType<ODataJsonLightCollectionWriter>(); }
public void WriteObject_Calls_CreateODataComplexValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetServiceDocumentUri(new Uri("http://any/")); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataComplexTypeSerializer> serializer = new Mock<ODataComplexTypeSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "ComplexPropertyName", Model = _model }; object graph = new object(); ODataComplexValue complexValue = new ODataComplexValue { TypeName = "NS.Name", Properties = new[] { new ODataProperty { Name = "Property1", Value = 42 } } }; serializer.CallBase = true; serializer.Setup(s => s.CreateODataComplexValue(graph, It.Is<IEdmComplexTypeReference>(e => e.Definition == _addressType), writeContext)) .Returns(complexValue).Verifiable(); // Act serializer.Object.WriteObject(graph, typeof(Address), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("value", element.Name.LocalName); Assert.Equal("#NS.Name", element.Attributes().Single(a => a.Name.LocalName == "type").Value); Assert.Equal(1, element.Descendants().Count()); Assert.Equal("42", element.Descendants().Single().Value); Assert.Equal("Property1", element.Descendants().Single().Name.LocalName); }
protected override ODataMessageWriterSettings GetWriterSettings() { ODataMessageWriterSettings settings = new ODataMessageWriterSettings { PayloadBaseUri = this.ServiceRootUri }; settings.SetContentType(ODataFormat.Json); return settings; }
public void WriterShouldNotIncludeTypeNameForCollectionOfDerivedType() { // JSON Light: writer doesn't include type name for collection of derived type // If I have a collection property declared in metadata as Collection(Edm.Geography), // and at serialization type, it's clearly a Collection(Edm.GeographyPoint), // we won't write the type name for that property by default (i.e., minimal metadata mode). var model = new EdmModel(); var entityType = new EdmEntityType("Var1", "Type"); entityType.AddKeys(entityType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32)); entityType.AddProperty(new EdmStructuralProperty(entityType, "Geographies", new EdmCollectionTypeReference(new EdmCollectionType(EdmCoreModel.Instance.GetSpatial(EdmPrimitiveTypeKind.Geography, false))))); model.AddElement(entityType); var writerSettings = new ODataMessageWriterSettings(); writerSettings.SetContentType(ODataFormat.Json); writerSettings.DisableMessageStreamDisposal = true; var message = new InMemoryMessage { Stream = new MemoryStream() }; using (ODataMessageWriter odataMessageWriter = new ODataMessageWriter((IODataRequestMessage)message, writerSettings, model)) { ODataWriter odataWriter = odataMessageWriter.CreateODataEntryWriter(); odataWriter.WriteStart( new ODataEntry { TypeName = "Var1.Type", Properties = new[] { new ODataProperty() { Name = "Id", Value = 1 }, new ODataProperty() { Name = "Geographies", Value = new ODataCollectionValue { Items = new[] { GeographyPoint.Create(0,0), GeographyPoint.Create(1,1), GeographyPoint.Create(2,2) } } }, } }); odataWriter.WriteEnd(); odataWriter.Flush(); } message.Stream.Position = 0; var output = new StreamReader(message.Stream).ReadToEnd(); Assert.IsFalse(output.Contains("Collection(Edm.GeographyPoint)"), @"output.Contains(""Collection(Edm.GeographyPoint)"" == false"); }
public void JsonPaddingEnabledWithRawValueSpecified() { var settings = new ODataMessageWriterSettings {JsonPCallback = "functionName", DisableMessageStreamDisposal = true}; settings.SetContentType(ODataFormat.RawValue); IODataResponseMessage message = new InMemoryMessage {StatusCode = 200, Stream = new MemoryStream()}; using (var writer = new ODataMessageWriter(message, settings)) { writer.WriteValue(123); } var responseStream = message.GetStream(); responseStream.Position = 0; var responseString = new StreamReader(responseStream).ReadToEnd(); responseString.Should().Be("functionName(123)"); message.GetHeader("Content-Type").Should().StartWith("text/javascript"); }
public void JsonPaddingEnabledWithJsonFormatSpecified() { var settings = new ODataMessageWriterSettings {JsonPCallback = "functionName", DisableMessageStreamDisposal = true}; settings.SetContentType(ODataFormat.Json); settings.SetServiceDocumentUri(new Uri("http://stuff")); IODataResponseMessage message = new InMemoryMessage {StatusCode = 200, Stream = new MemoryStream()}; var property = new ODataProperty {Name = "PropertyName", Value = "value"}; using (var writer = new ODataMessageWriter(message, settings)) { writer.WriteProperty(property); } var responseStream = message.GetStream(); responseStream.Position = 0; var responseString = new StreamReader(responseStream).ReadToEnd(); responseString.Should().Be("functionName({\"@odata.context\":\"http://stuff/$metadata#Edm.String\",\"value\":\"value\"})"); message.GetHeader("Content-Type").Should().StartWith("text/javascript"); }
public void ODataErrorSerializer_Works() { // Arrange ODataErrorSerializer serializer = new ODataErrorSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataError error = new ODataError { Message = "Error!!!" }; ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(error, typeof(ODataError), writer, new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("Error!!!", element.Descendants().Single(e => e.Name.LocalName == "message").Value); }
public void ODataWorkspaceSerializer_Works() { // Arrange ODataServiceDocumentSerializer serializer = new ODataServiceDocumentSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetServiceDocumentUri(new Uri("http://any/")); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(new ODataServiceDocument(), _workspaceType, writer, new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("service", element.Name.LocalName); }
public void ODataErrorSerializer_Works() { // Arrange ODataErrorSerializer serializer = new ODataErrorSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataError error = new ODataError { Message = "Error!!!" }; ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(error, typeof(ODataError), writer, new ODataSerializerContext()); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"error\":{\"code\":\"\",\"message\":\"Error!!!\"}}", result); }
public void ODataEntityReferenceLinkSerializer_Serializes_Uri(object link) { // Arrange ODataEntityReferenceLinkSerializer serializer = new ODataEntityReferenceLinkSerializer(); ODataSerializerContext writeContext = new ODataSerializerContext(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(link, typeof(ODataEntityReferenceLink), writer, writeContext); // Assert stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#$ref\",\"@odata.id\":\"http://sampleuri/\"}", result); }
public void ODataServiceDocumentSerializer_Works() { // Arrange ODataServiceDocumentSerializer serializer = new ODataServiceDocumentSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(new ODataServiceDocument(), _workspaceType, writer, new ODataSerializerContext()); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"@odata.context\":\"http://any/$metadata\",\"value\":[]}", result); }
public void Read_RoundTrips() { // Arrange var deserializer = new ODataEntityReferenceLinkDeserializer(); MockODataRequestMessage requestMessage = new MockODataRequestMessage(); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, settings); messageWriter.WriteEntityReferenceLink(new ODataEntityReferenceLink { Url = new Uri("http://localhost/samplelink") }); ODataMessageReader messageReader = new ODataMessageReader(new MockODataRequestMessage(requestMessage)); ODataDeserializerContext context = new ODataDeserializerContext { Request = new HttpRequestMessage(), Path = new ODataPath(new NavigationPathSegment(GetNavigationProperty(CreateModel()))) }; // Act Uri uri = deserializer.Read(messageReader, typeof(Uri), context) as Uri; // Assert Assert.NotNull(uri); Assert.Equal("http://localhost/samplelink", uri.AbsoluteUri); }
protected void WriteAnnotationsAndValidatePayload(Action<ODataWriter> action, ODataFormat format, string expectedPayload, bool request, bool createFeedWriter) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true, EnableAtom = true }; writerSettings.SetContentType(format); writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com/")); MemoryStream stream = new MemoryStream(); if (request) { IODataRequestMessage requestMessageToWrite = new InMemoryMessage { Method = "GET", Stream = stream }; using (var messageWriter = new ODataMessageWriter(requestMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = createFeedWriter ? messageWriter.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(EntitySet, EntityType); action(odataWriter); } } else { IODataResponseMessage responseMessageToWrite = new InMemoryMessage { StatusCode = 200, Stream = stream }; using (var messageWriter = new ODataMessageWriter(responseMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = createFeedWriter ? messageWriter.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(EntitySet, EntityType); action(odataWriter); } } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); if (format == ODataFormat.Atom) { // The <updated> element is computed dynamically, so we remove it from the both the baseline and the actual payload. payload = Regex.Replace(payload, "<updated>[^<]*</updated>", ""); expectedPayload = Regex.Replace(expectedPayload, "<updated>[^<]*</updated>", ""); } Assert.AreEqual(expectedPayload, payload); }
// TODO: ATOM top level individual property testings // FlagsEnumAsComplexPropertyAsTopLevelValue_StrAsValue_StrAsTypeName // FlagsEnumAsCollectionItemAsTopLevelValue_StrAsValue_StrAsTypeName #endregion #region private methods public void WriteToMessageWriterAndVerifyPayload(string contentType, Action<ODataMessageWriter> writerAction, string expectedPayload) { ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { Version = ODataVersion.V4, AutoComputePayloadMetadataInJson = true, DisableMessageStreamDisposal = true, EnableAtom = true}; settings.SetContentType(contentType, "utf-8"); settings.SetServiceDocumentUri(ServiceDocumentUri); // with model { MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new InMemoryMessage() { Stream = stream }; using (ODataMessageWriter writer = new ODataMessageWriter(message, settings, this.userModel)) { writerAction(writer); } stream.Seek(0, SeekOrigin.Begin); string payload = (new StreamReader(stream)).ReadToEnd(); payload.Should().Be(expectedPayload); } // without model { MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new InMemoryMessage() { Stream = stream }; using (ODataMessageWriter writer = new ODataMessageWriter(message, settings)) { writerAction(writer); } stream.Seek(0, SeekOrigin.Begin); string payload = (new StreamReader(stream)).ReadToEnd(); payload.Should().Be(expectedPayload); } }
private ODataMessageWriterSettings GetWriterSettings(bool isRawValue = false) { var settings = new ODataMessageWriterSettings() { ODataUri = new ODataUri() { RequestUri = _session.Settings.BaseUri, }, Indent = true, DisableMessageStreamDisposal = !IsBatch, }; ODataFormat contentType; if (isRawValue) { contentType = ODataFormat.RawValue; } else { switch (_session.Settings.PayloadFormat) { case ODataPayloadFormat.Atom: #pragma warning disable 0618 contentType = ODataFormat.Atom; #pragma warning restore 0618 break; case ODataPayloadFormat.Json: default: contentType = ODataFormat.Json; break; } } settings.SetContentType(contentType); return settings; }
private static ODataMessageWriterSettings CreateJsonLightSettings() { ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Json); settings.SetMetadataDocumentUri(CreateFakeUri()); return settings; }
private static ODataMessageWriterSettings CreateJsonLightSettings() { ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); return settings; }
public void Read_DateTimePrimitive(DateTimeOffset expected, DateTime value, TimeZoneInfo timeZoneInfo) { // Arrange IEdmModel model = CreateModel(); HttpRequestMessage request = new HttpRequestMessage(); request.SetConfiguration(new HttpConfiguration()); if (timeZoneInfo != null) { request.GetConfiguration().SetTimeZoneInfo(timeZoneInfo); } else { request.GetConfiguration().SetTimeZoneInfo(TimeZoneInfo.Local); } ODataPrimitiveSerializer serializer = new ODataPrimitiveSerializer(); ODataPrimitiveDeserializer deserializer = new ODataPrimitiveDeserializer(); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = model, Request = request }; ODataDeserializerContext readContext = new ODataDeserializerContext { Model = model, Request = request }; serializer.WriteObject(value, typeof(DateTimeOffset), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); // Act && Assert Assert.Equal(expected, deserializer.Read(messageReader, typeof(DateTimeOffset), readContext)); }
private static string WriteJsonLightEntry(bool isRequest, Uri serviceDocumentUri, bool specifySet, ODataEntry odataEntry, IEdmNavigationSource entitySet, IEdmEntityType entityType, ODataUri odataUri) { var model = new EdmModel(); model.AddElement(new EdmEntityContainer("Fake", "Container_sub")); var stream = new MemoryStream(); var message = new InMemoryMessage { Stream = stream }; var settings = new ODataMessageWriterSettings { Version = ODataVersion.V4, AutoComputePayloadMetadataInJson = true }; settings.ODataUri = odataUri; settings.SetServiceDocumentUri(serviceDocumentUri); settings.SetContentType(ODataFormat.Json); settings.SetContentType("application/json;odata.metadata=full", null); ODataMessageWriter messageWriter; if (isRequest) { messageWriter = new ODataMessageWriter((IODataRequestMessage)message, settings, TestUtils.WrapReferencedModelsToMainModel("Fake", "Container", model)); } else { messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, TestUtils.WrapReferencedModelsToMainModel("Fake", "Container", model)); } var entryWriter = messageWriter.CreateODataEntryWriter(specifySet ? entitySet : null, entityType); entryWriter.WriteStart(odataEntry); entryWriter.WriteEnd(); entryWriter.Flush(); var actual = Encoding.UTF8.GetString(stream.ToArray()); return actual; }
private string WriterEntry(IEdmModel userModel, ODataEntry entry, EdmEntitySet entitySet, IEdmEntityType entityType, bool fullMetadata = false) { var message = new InMemoryMessage() { Stream = new MemoryStream() }; var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true, AutoComputePayloadMetadataInJson = true }; 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.CreateODataEntryWriter(entitySet, entityType); writer.WriteStart(entry); writer.WriteEnd(); } message.Stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(message.Stream)) { return reader.ReadToEnd(); } }
private string WriteODataEntry(ODataEntry entryToWrite) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true }; writerSettings.SetContentType(ODataFormat.Json); writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com/")); MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessageToWrite = new InMemoryMessage { Method = "GET", Stream = stream }; using (var messageWriter = new ODataMessageWriter(requestMessageToWrite, writerSettings, this.model)) { ODataWriter odataWriter = messageWriter.CreateODataEntryWriter(this.entitySet, this.entityType); odataWriter.WriteStart(entryToWrite); odataWriter.WriteEnd(); } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); return payload; }
/// <summary> /// Writes an ODataError with the given custom instance annotation to the test stream. /// </summary> private void WriteError(params KeyValuePair<string, ODataValue>[] annotations) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true }; writerSettings.SetContentType(ODataFormat.Json); writerSettings.SetServiceDocumentUri(new Uri("http://example.com/")); IODataResponseMessage messageToWrite = new InMemoryMessage { StatusCode = 400, Stream = this.stream }; var error = new ODataError(); var instanceAnnotations = new Collection<ODataInstanceAnnotation>(); error.SetInstanceAnnotations(instanceAnnotations); foreach (var pair in annotations) { ODataInstanceAnnotation annotation = new ODataInstanceAnnotation(pair.Key, pair.Value); instanceAnnotations.Add(annotation); } using (var writer = new ODataMessageWriter(messageToWrite, writerSettings, this.model)) { writer.WriteError(error, false); } }
protected virtual ODataMessageWriterSettings GetWriterSettings() { ODataMessageWriterSettings settings = new ODataMessageWriterSettings { AutoComputePayloadMetadataInJson = true, PayloadBaseUri = this.ServiceRootUri, ODataUri = new ODataUri() { RequestUri = this.RequestUri, ServiceRoot = this.ServiceRootUri, Path = this.QueryContext.QueryPath, SelectAndExpand = this.QueryContext.QuerySelectExpandClause, } }; // TODO: howang why here? if (this.QueryContext != null) { if (this.QueryContext.CanonicalUri == null) { settings.ODataUri.RequestUri = this.QueryContext.QueryUri; settings.ODataUri.Path = this.QueryContext.QueryPath; } else { settings.ODataUri.RequestUri = this.QueryContext.CanonicalUri; ODataUriParser uriParser = new ODataUriParser(this.DataSource.Model, ServiceConstants.ServiceBaseUri, this.QueryContext.CanonicalUri); settings.ODataUri.Path = uriParser.ParsePath(); } } // TODO: howang read the encoding from request. settings.SetContentType(string.IsNullOrEmpty(this.QueryContext.FormatOption) ? this.RequestAcceptHeader : this.QueryContext.FormatOption, Encoding.UTF8.WebName); return settings; }
/// <summary> /// Creates the default settings for a given <see cref="ODataFormat"/>. /// </summary> /// <param name="format">The format for the message writer settings to create.</param> /// <param name="version">Version of the OData protocol.</param> /// <param name="baseUri">Base uri for all relative Uris.</param> /// <param name="disableMessageStreamDisposal">When set to true, the writer will not dispose the message stream. When set to false, the message stream will be disposed.</param> /// <returns>The default message writer settings for the specified <paramref name="format"/>.</returns> private static ODataMessageWriterSettings GetDefaultMessageWriterSettings( ODataFormat format, Uri baseUri, bool disableMessageStreamDisposal, ODataVersion version = ODataVersion.V4) { var settings = new ODataMessageWriterSettings() { Version = version, PayloadBaseUri = baseUri, DisableMessageStreamDisposal = disableMessageStreamDisposal, EnableAtom = true }; settings.SetServiceDocumentUri(new Uri("http://odata.org/test")); settings.SetContentType(format); return settings; }
public void WriteObject_Calls_CreateODataComplexValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataComplexTypeSerializer> serializer = new Mock<ODataComplexTypeSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "ComplexPropertyName", Model = _model }; object graph = new object(); ODataComplexValue complexValue = new ODataComplexValue { TypeName = "NS.Name", Properties = new[] { new ODataProperty { Name = "Property1", Value = 42 } } }; serializer.CallBase = true; serializer.Setup(s => s.CreateODataComplexValue(graph, It.Is<IEdmComplexTypeReference>(e => e.Definition == _addressType), writeContext)) .Returns(complexValue).Verifiable(); // Act serializer.Object.WriteObject(graph, typeof(Address), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#NS.Name\",\"Property1\":42}", result); }
private string WriteAtomEntry(ODataEntry entry) { MemoryStream stream = new MemoryStream(); InMemoryMessage message = new InMemoryMessage { Stream = stream }; var settings = new ODataMessageWriterSettings { Version = ODataVersion.V4, AutoComputePayloadMetadataInJson = true, EnableAtom = true}; settings.SetServiceDocumentUri(new Uri("http://temp.org/")); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, Model); var entryWriter = messageWriter.CreateODataEntryWriter(EntitySet, EntityType); entryWriter.WriteStart(entry); entryWriter.WriteEnd(); entryWriter.Flush(); var actual = Encoding.UTF8.GetString(stream.ToArray()); return actual; }