public override Task WriteToStreamAsync(System.Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext) { RelationAggregator aggregator; lock (this.RelationAggregators) { if (this.RelationAggregators.ContainsKey(writeStream)) { aggregator = this.RelationAggregators[writeStream]; } else { aggregator = new RelationAggregator(); this.RelationAggregators[writeStream] = aggregator; } } var contentHeaders = content == null ? null : content.Headers; var effectiveEncoding = SelectCharacterEncoding(contentHeaders); JsonWriter writer = this.CreateJsonWriter(typeof(object), writeStream, effectiveEncoding); JsonSerializer serializer = this.CreateJsonSerializer(); if (_errorSerializer.CanSerialize(type)) { // `value` is an error _errorSerializer.SerializeError(value, writeStream, writer, serializer); } else { Type valtype = GetSingleType(value.GetType()); if (_modelManager.IsSerializedAsMany(value.GetType())) { aggregator.AddPrimary(valtype, (IEnumerable <object>)value); } else { aggregator.AddPrimary(valtype, value); } //writer.Formatting = Formatting.Indented; var root = _modelManager.GetJsonKeyForType(type); writer.WriteStartObject(); writer.WritePropertyName(root); if (_modelManager.IsSerializedAsMany(value.GetType())) { this.SerializeMany(value, writeStream, writer, serializer, aggregator); } else { this.Serialize(value, writeStream, writer, serializer, aggregator); } // Include links from aggregator SerializeLinkedResources(writeStream, writer, serializer, aggregator); writer.WriteEndObject(); } writer.Flush(); lock (this.RelationAggregators) { this.RelationAggregators.Remove(writeStream); } //return base.WriteToStreamAsync(type, obj as object, writeStream, content, transportContext); //TODO: For now we won't worry about optimizing this down into smaller async parts, we'll just do it all synchronous. So... // Just return a completed task... from http://stackoverflow.com/a/17527551/489116 var tcs = new TaskCompletionSource <object>(); tcs.SetResult(null); return(tcs.Task); }