public void WriteMessageAsync_ResponseContainsContentId_IfHasContentIdInRequestChangeSet() { MemoryStream ms = new MemoryStream(); HttpContent content = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); IODataResponseMessage odataResponse = new ODataMessageWrapper(ms, content.Headers); var batchWriter = new ODataMessageWriter(odataResponse).CreateODataBatchWriter(); HttpResponseMessage response = new HttpResponseMessage { Content = new StringContent("any", Encoding.UTF8, "text/example") }; var request = new HttpRequestMessage(); var contentId = Guid.NewGuid().ToString(); request.SetODataContentId(contentId); response.RequestMessage = request; batchWriter.WriteStartBatch(); batchWriter.WriteStartChangeset(); ODataBatchResponseItem.WriteMessageAsync(batchWriter, response, CancellationToken.None).Wait(); batchWriter.WriteEndChangeset(); batchWriter.WriteEndBatch(); ms.Position = 0; string result = new StreamReader(ms).ReadToEnd(); Assert.Contains("any", result); Assert.Contains("text/example", result); Assert.Contains("Content-ID", result); Assert.Contains(contentId, result); }
public void ResolveUrl_ThrowsArgumentNull_PayloadUri() { var message = new ODataMessageWrapper(); Assert.ThrowsArgumentNull( () => message.ResolveUrl(new Uri("http://localhost"), null), "payloadUri"); }
public void WriteMessageAsync_WritesResponseMessage() { MemoryStream ms = new MemoryStream(); HttpContent content = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); IODataResponseMessage odataResponse = new ODataMessageWrapper(ms, content.Headers); var batchWriter = new ODataMessageWriter(odataResponse).CreateODataBatchWriter(); HttpResponseMessage response = new HttpResponseMessage() { Content = new StringContent("example content", Encoding.UTF8, "text/example") }; response.Headers.Add("customHeader", "bar"); batchWriter.WriteStartBatch(); ODataBatchResponseItem.WriteMessageAsync(batchWriter, response, CancellationToken.None).Wait(); batchWriter.WriteEndBatch(); ms.Position = 0; string result = new StreamReader(ms).ReadToEnd(); Assert.Contains("example content", result); Assert.Contains("text/example", result); Assert.Contains("customHeader", result); Assert.Contains("bar", result); }
public void Posting_NonDerivedType_To_Action_Expecting_BaseType_Throws() { // Arrange StringContent content = new StringContent("{ '@odata.type' : '#System.Web.OData.Builder.TestModels.Motorcycle' }"); content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); IODataRequestMessage oDataRequest = new ODataMessageWrapper(content.ReadAsStreamAsync().Result, content.Headers); ODataMessageReader reader = new ODataMessageReader(oDataRequest, new ODataMessageReaderSettings(), _model); ODataDeserializerProvider deserializerProvider = DependencyInjectionHelper.GetDefaultODataDeserializerProvider(); ODataDeserializerContext context = new ODataDeserializerContext { Model = _model }; IEdmActionImport action = _model.EntityContainer .OperationImports() .Single(f => f.Name == "PostMotorcycle_When_Expecting_Car") as IEdmActionImport; Assert.NotNull(action); IEdmEntitySetBase actionEntitySet; action.TryGetStaticEntitySet(_model, out actionEntitySet); context.Path = new ODataPath(new OperationImportSegment(new[] { action }, actionEntitySet, null)); // Act & Assert Assert.Throws <ODataException>( () => new ODataResourceDeserializer(deserializerProvider).Read(reader, typeof(Car), context), "A resource with type 'System.Web.OData.Builder.TestModels.Motorcycle' was found, " + "but it is not assignable to the expected type 'System.Web.OData.Builder.TestModels.Car'. " + "The type specified in the resource must be equal to either the expected type or a derived type."); }
public void ResolveUrl_ReturnsNull_IfNoContentIdInUri() { var message = new ODataMessageWrapper(); Uri uri = message.ResolveUrl(new Uri("http://localhost"), new Uri("/values", UriKind.Relative)); Assert.Null(uri); }
public void ResolveUrl_ThrowsArgumentNull_PayloadUri() { var message = new ODataMessageWrapper(); Assert.ThrowsArgumentNull( () => message.ConvertPayloadUri(new Uri("http://localhost"), null), "payloadUri"); }
public void ResolveUrl_ReturnsNull_IfNoContentIdInUri() { var message = new ODataMessageWrapper(); Uri uri = message.ConvertPayloadUri(new Uri("http://localhost"), new Uri("/values", UriKind.Relative)); Assert.Null(uri); }
public void ResolveUrl_ReturnsOriginalUri_IfContentIdCannotBeResolved() { StringContent content = new StringContent(String.Empty); var message = new ODataMessageWrapper(new MemoryStream(), content.Headers); Uri uri = message.ResolveUrl(new Uri("http://localhost"), new Uri("$1", UriKind.Relative)); Assert.Equal("$1", uri.OriginalString); }
public void ResolveUrl_ReturnsOriginalUri_IfContentIdCannotBeResolved() { StringContent content = new StringContent(String.Empty); var message = new ODataMessageWrapper(new MemoryStream(), content.Headers); Uri uri = message.ConvertPayloadUri(new Uri("http://localhost"), new Uri("$1", UriKind.Relative)); Assert.Equal("$1", uri.OriginalString); }
public void WriteMessageAsync_NullResponse_Throws() { HttpContent content = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); IODataResponseMessage odataResponse = new ODataMessageWrapper(new MemoryStream(), content.Headers); ODataMessageWriter messageWriter = new ODataMessageWriter(odataResponse); Assert.ThrowsArgumentNull( () => ODataBatchResponseItem.WriteMessageAsync(messageWriter.CreateODataBatchWriter(), null, CancellationToken.None) .Wait(), "response"); }
public void ResolveUrl_ResolvesUriWithContentId() { StringContent content = new StringContent(String.Empty); Dictionary <string, string> contentIdMapping = new Dictionary <string, string> { { "1", "http://localhost/values(1)" }, { "11", "http://localhost/values(11)" }, }; var message = new ODataMessageWrapper(new MemoryStream(), content.Headers, contentIdMapping); Uri uri = message.ConvertPayloadUri(new Uri("http://localhost"), new Uri("$1", UriKind.Relative)); Assert.Equal("http://localhost/values(1)", uri.OriginalString); }
public void ResolveUrl_ResolvesUriWithContentId() { StringContent content = new StringContent(String.Empty); Dictionary<string, string> contentIdMapping = new Dictionary<string, string> { {"1", "http://localhost/values(1)"}, {"11", "http://localhost/values(11)"}, }; var message = new ODataMessageWrapper(new MemoryStream(), content.Headers, contentIdMapping); Uri uri = message.ResolveUrl(new Uri("http://localhost"), new Uri("$1", UriKind.Relative)); Assert.Equal("http://localhost/values(1)", uri.OriginalString); }
/// <summary> /// Gets the <see cref="ODataMessageReader"/> for the <see cref="HttpContent"/> stream. /// </summary> /// <param name="content">The <see cref="HttpContent"/>.</param> /// <param name="settings">The <see cref="ODataMessageReaderSettings"/>.</param> /// <param name="cancellationToken">The token to monitor for cancellation requests.</param> /// <returns>A task object that produces an <see cref="ODataMessageReader"/> when completed.</returns> public static async Task<ODataMessageReader> GetODataMessageReaderAsync(this HttpContent content, ODataMessageReaderSettings settings, CancellationToken cancellationToken) { if (content == null) { throw Error.ArgumentNull("content"); } cancellationToken.ThrowIfCancellationRequested(); Stream contentStream = await content.ReadAsStreamAsync(); IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(contentStream, content.Headers); ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, settings); return oDataMessageReader; }
/// <inheritdoc/> protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) { IODataResponseMessage responseMessage = new ODataMessageWrapper(stream, Headers); ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, _writerSettings); ODataBatchWriter writer = messageWriter.CreateODataBatchWriter(); writer.WriteStartBatch(); foreach (ODataBatchResponseItem response in Responses) { await response.WriteResponseAsync(writer, CancellationToken.None); } writer.WriteEndBatch(); }
public void WriteResponseAsync_WritesOperation() { OperationResponseItem responseItem = new OperationResponseItem(new HttpResponseMessage(HttpStatusCode.Accepted)); MemoryStream memoryStream = new MemoryStream(); IODataResponseMessage responseMessage = new ODataMessageWrapper(memoryStream); ODataMessageWriter writer = new ODataMessageWriter(responseMessage); ODataBatchWriter batchWriter = writer.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); responseItem.WriteResponseAsync(batchWriter, CancellationToken.None).Wait(); batchWriter.WriteEndBatch(); memoryStream.Position = 0; string responseString = new StreamReader(memoryStream).ReadToEnd(); Assert.Contains("Accepted", responseString); }
private static object ConvertResourceOrResourceSet(object oDataValue, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { string valueString = oDataValue as string; Contract.Assert(valueString != null); if (edmTypeReference.IsNullable && String.Equals(valueString, "null", StringComparison.Ordinal)) { return(null); } HttpRequestMessage request = readContext.Request; ODataMessageReaderSettings oDataReaderSettings = request.GetReaderSettings(); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(valueString))) { stream.Seek(0, SeekOrigin.Begin); IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(stream, null, request.GetODataContentIdMapping()); using ( ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, oDataReaderSettings, readContext.Model)) { request.RegisterForDispose(oDataMessageReader); if (edmTypeReference.IsCollection()) { return(ConvertResourceSet(oDataMessageReader, edmTypeReference, readContext)); } else { return(ConvertResource(oDataMessageReader, edmTypeReference, readContext)); } } } }
public void WriteResponseAsync_WritesChangeSet() { HttpResponseMessage[] responses = new HttpResponseMessage[] { new HttpResponseMessage(HttpStatusCode.Accepted), new HttpResponseMessage(HttpStatusCode.NoContent) }; ChangeSetResponseItem responseItem = new ChangeSetResponseItem(responses); MemoryStream memoryStream = new MemoryStream(); IODataResponseMessage responseMessage = new ODataMessageWrapper(memoryStream); ODataMessageWriter writer = new ODataMessageWriter(responseMessage); ODataBatchWriter batchWriter = writer.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); responseItem.WriteResponseAsync(batchWriter, CancellationToken.None).Wait(); batchWriter.WriteEndBatch(); memoryStream.Position = 0; string responseString = new StreamReader(memoryStream).ReadToEnd(); Assert.Contains("changesetresponse", responseString); Assert.Contains("Accepted", responseString); Assert.Contains("No Content", responseString); }
private void WriteToStream(Type type, object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders) { IEdmModel model = Request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } ODataSerializer serializer = GetSerializer(type, value, model, _serializerProvider); UrlHelper urlHelper = Request.GetUrlHelper() ?? new UrlHelper(Request); ODataPath path = Request.ODataProperties().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; // serialize a response HttpConfiguration configuration = Request.GetConfiguration(); if (configuration == null) { throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); } IODataResponseMessage responseMessage = new ODataMessageWrapper(writeStream, content.Headers); Uri baseAddress = GetBaseAddress(Request); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(MessageWriterSettings) { PayloadBaseUri = baseAddress, Version = _version, }; string metadataLink = urlHelper.CreateODataLink(new MetadataPathSegment()); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = Request.ODataProperties().SelectExpandClause, }; MediaTypeHeaderValue contentType = null; if (contentHeaders != null && contentHeaders.ContentType != null) { contentType = contentHeaders.ContentType; } using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Request = Request, RequestContext = Request.GetRequestContext(), Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(contentType), SelectExpandClause = Request.ODataProperties().SelectExpandClause }; serializer.WriteObject(value, type, messageWriter, writeContext); } }
private object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { object result; HttpContentHeaders contentHeaders = content == null ? null : content.Headers; // If content length is 0 then return default value for this type if (contentHeaders == null || contentHeaders.ContentLength == 0) { result = GetDefaultValueForType(type); } else { IEdmModel model = Request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } IEdmTypeReference expectedPayloadType; ODataDeserializer deserializer = GetDeserializer(type, Request.ODataProperties().Path, model, _deserializerProvider, out expectedPayloadType); if (deserializer == null) { throw Error.Argument("type", SRResources.FormatterReadIsNotSupportedForType, type.FullName, GetType().FullName); } try { ODataMessageReaderSettings oDataReaderSettings = new ODataMessageReaderSettings(MessageReaderSettings); oDataReaderSettings.BaseUri = GetBaseAddress(Request); IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(readStream, contentHeaders, Request.GetODataContentIdMapping()); ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, oDataReaderSettings, model); Request.RegisterForDispose(oDataMessageReader); ODataPath path = Request.ODataProperties().Path; ODataDeserializerContext readContext = new ODataDeserializerContext { Path = path, Model = model, Request = Request, ResourceType = type, ResourceEdmType = expectedPayloadType, RequestContext = Request.GetRequestContext(), }; result = deserializer.Read(oDataMessageReader, type, readContext); } catch (Exception e) { if (formatterLogger == null) { throw; } formatterLogger.LogError(String.Empty, e); result = GetDefaultValueForType(type); } } return result; }
private object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { object result; HttpContentHeaders contentHeaders = content == null ? null : content.Headers; // If content length is 0 then return default value for this type if (contentHeaders == null || contentHeaders.ContentLength == 0) { result = GetDefaultValueForType(type); } else { IEdmModel model = Request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } IEdmTypeReference expectedPayloadType; ODataDeserializer deserializer = GetDeserializer(type, Request.ODataProperties().Path, model, _deserializerProvider, out expectedPayloadType); if (deserializer == null) { throw Error.Argument("type", SRResources.FormatterReadIsNotSupportedForType, type.FullName, GetType().FullName); } try { ODataMessageReaderSettings oDataReaderSettings = new ODataMessageReaderSettings(MessageReaderSettings); oDataReaderSettings.BaseUri = GetBaseAddress(Request); IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(readStream, contentHeaders, Request.GetODataContentIdMapping()); ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, oDataReaderSettings, model); Request.RegisterForDispose(oDataMessageReader); ODataPath path = Request.ODataProperties().Path; ODataDeserializerContext readContext = new ODataDeserializerContext { Path = path, Model = model, Request = Request, ResourceType = type, ResourceEdmType = expectedPayloadType, RequestContext = Request.GetRequestContext(), }; result = deserializer.Read(oDataMessageReader, type, readContext); } catch (Exception e) { if (formatterLogger == null) { throw; } formatterLogger.LogError(String.Empty, e); result = GetDefaultValueForType(type); } } return(result); }
internal static object ConvertFeedOrEntry(object oDataValue, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { string valueString = oDataValue as string; Contract.Assert(valueString != null); if (edmTypeReference.IsNullable && String.Equals(valueString, "null", StringComparison.Ordinal)) { return null; } HttpRequestMessage request = readContext.Request; ODataMessageReaderSettings oDataReaderSettings = new ODataMessageReaderSettings(); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(valueString))) { stream.Seek(0, SeekOrigin.Begin); IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(stream, null, request.GetODataContentIdMapping()); using ( ODataMessageReader oDataMessageReader = new ODataMessageReader(oDataRequestMessage, oDataReaderSettings, readContext.Model)) { request.RegisterForDispose(oDataMessageReader); if (edmTypeReference.IsCollection()) { return ConvertFeed(oDataMessageReader, edmTypeReference, readContext); } else { return ConvertEntity(oDataMessageReader, edmTypeReference, readContext); } } } }
public void Posting_NonDerivedType_To_Action_Expecting_BaseType_Throws() { // Arrange StringContent content = new StringContent("{ '@odata.type' : '#System.Web.OData.Builder.TestModels.Motorcycle' }"); content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); IODataRequestMessage oDataRequest = new ODataMessageWrapper(content.ReadAsStreamAsync().Result, content.Headers); ODataMessageReader reader = new ODataMessageReader(oDataRequest, new ODataMessageReaderSettings(), _model); ODataDeserializerProvider deserializerProvider = new DefaultODataDeserializerProvider(); ODataDeserializerContext context = new ODataDeserializerContext { Model = _model }; IEdmActionImport action = _model.EntityContainer .OperationImports() .Single(f => f.Name == "PostMotorcycle_When_Expecting_Car") as IEdmActionImport; Assert.NotNull(action); context.Path = new ODataPath(new UnboundActionPathSegment(action)); // Act & Assert Assert.Throws<ODataException>( () => new ODataEntityDeserializer(deserializerProvider).Read(reader, typeof(Car), context), "An entry with type 'System.Web.OData.Builder.TestModels.Motorcycle' was found, " + "but it is not assignable to the expected type 'System.Web.OData.Builder.TestModels.Car'. " + "The type specified in the entry must be equal to either the expected type or a derived type."); }
private void WriteToStream(Type type, object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders) { IEdmModel model = Request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } ODataSerializer serializer = GetSerializer(type, value, model, _serializerProvider); UrlHelper urlHelper = Request.GetUrlHelper() ?? new UrlHelper(Request); ODataPath path = Request.ODataProperties().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; // serialize a response HttpConfiguration configuration = Request.GetConfiguration(); if (configuration == null) { throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); } string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(Request); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(writeStream, content.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(writeStream, content.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(Request); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(MessageWriterSettings) { PayloadBaseUri = baseAddress, Version = _version, }; string metadataLink = urlHelper.CreateODataLink(new MetadataPathSegment()); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = Request.ODataProperties().SelectExpandClause, Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; MediaTypeHeaderValue contentType = null; if (contentHeaders != null && contentHeaders.ContentType != null) { contentType = contentHeaders.ContentType; } using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Request = Request, RequestContext = Request.GetRequestContext(), Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(contentType), SelectExpandClause = Request.ODataProperties().SelectExpandClause }; serializer.WriteObject(value, type, messageWriter, writeContext); } }
private void WriteToStream(Type type, object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders) { IEdmModel model = Request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } ODataSerializer serializer = GetSerializer(type, value, model, _serializerProvider); UrlHelper urlHelper = Request.GetUrlHelper() ?? new UrlHelper(Request); ODataPath path = Request.ODataProperties().Path; IEdmEntitySet targetEntitySet = path == null ? null : path.EntitySet; // serialize a response HttpConfiguration configuration = Request.GetConfiguration(); if (configuration == null) { throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); } IODataResponseMessage responseMessage = new ODataMessageWrapper(writeStream, content.Headers); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(MessageWriterSettings) { PayloadBaseUri = GetBaseAddress(Request), Version = _version, }; string metadataLink = urlHelper.CreateODataLink(new MetadataPathSegment()); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } string resourcePath = path != null?path.ToString() : String.Empty; Uri baseAddress = GetBaseAddress(Request); writerSettings.SetServiceDocumentUri( baseAddress, Request.ODataProperties().SelectExpandClause, resourcePath, isIndividualProperty: false); writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. }; MediaTypeHeaderValue contentType = null; if (contentHeaders != null && contentHeaders.ContentType != null) { contentType = contentHeaders.ContentType; } using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Request = Request, RequestContext = Request.GetRequestContext(), Url = urlHelper, EntitySet = targetEntitySet, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(contentType), SelectExpandClause = Request.ODataProperties().SelectExpandClause }; serializer.WriteObject(value, type, messageWriter, writeContext); } }