public dynamic Execute(dynamic parameters, INancyModule module) { NuGetODataModelBuilderODataPackage builder = new NuGetODataModelBuilderODataPackage(); builder.Build(); IODataResponseMessage message = new MemoryResponseMessage(); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(); using (var msgWriter = new ODataMessageWriter(message, writerSettings, builder.Model)) { msgWriter.WriteMetadataDocument(); var msgStream = message.GetStream(); msgStream.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(msgStream); string text = reader.ReadToEnd(); return(new Response { ContentType = "application/xml; charset=utf-8", Contents = contentStream => { var byteData = Encoding.UTF8.GetBytes(text); contentStream.Write(byteData, 0, byteData.Length); msgStream.Dispose(); reader.Dispose(); } }); } }
/// <summary> /// Get the OData metadata about the reliable collections from the reliable state manager using reflection. /// </summary> /// <param name="stateManager">Reliable state manager for the replica.</param> /// <returns>The OData metadata for this state manager.</returns> public static async Task <string> GetMetadataAsync(this IReliableStateManager stateManager) { // Build the OData model from the queryable types in the reliable state manager. var builder = new ODataConventionModelBuilder(); foreach (var queryable in await stateManager.GetQueryableTypes().ConfigureAwait(false)) { var qkey = queryable.Key; var qkey2 = qkey.Replace('.', '#'); Console.WriteLine(qkey2); dictEntityMap.Add(queryable.Key, qkey2); var entity = builder.AddEntity(queryable.Value); builder.AddEntitySet(qkey2, entity); } var model = builder.GetEdmModel(); // Write the OData metadata document. using (var stream = new MemoryStream()) using (var message = new InMemoryMessage { Stream = stream }) { var settings = new ODataMessageWriterSettings(); var writer = new ODataMessageWriter((IODataResponseMessage)message, settings, model); writer.WriteMetadataDocument(); return(Encoding.UTF8.GetString(stream.ToArray())); } }
/// <inheritdoc/> /// <remarks>The metadata written is from the model set on the <paramref name="messageWriter"/>. The <paramref name="graph" /> /// is not used.</remarks> public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } // NOTE: ODataMessageWriter doesn't have a way to set the IEdmModel. So, there is an underlying assumption here that // the model received by this method and the model passed(from configuration) while building ODataMessageWriter is the same (clr object). messageWriter.WriteMetadataDocument(); }
/// <inheritdoc/> /// <remarks>The metadata written is from the model set on the <paramref name="messageWriter"/>. The <paramref name="graph" /> /// is not used.</remarks> public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } // NOTE: ODataMessageWriter doesn't have a way to set the IEdmModel. So, there is an underlying assumption here that // the model received by this method and the model passed(from configuration) while building ODataMessageWriter is the same (clr object). messageWriter.WriteMetadataDocument(); }
/// <inheritdoc/> /// <remarks>The metadata written is from the model set on the <paramref name="messageWriter"/>. The <paramref name="graph" /> /// is not used.</remarks> public override Task WriteObjectAsync(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } // NOTE: ODataMessageWriter doesn't have a way to set the IEdmModel. So, there is an underlying assumption here that // the model received by this method and the model passed(from configuration) while building ODataMessageWriter is the same (clr object). // Note: MessageWriter doesn't have a WriteMetadataDocumentAsync method. We should fix that by providing a default implementation in the base class. return(Task.Run(() => messageWriter.WriteMetadataDocument())); }
/// <inheritdoc/> /// <remarks>The metadata written is from the model set on the <paramref name="messageWriter"/>. The <paramref name="graph" /> /// is not used.</remarks> public override Task WriteObjectAsync(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { return(Task.FromException(Error.ArgumentNull(nameof(messageWriter)))); } // NOTE: ODataMessageWriter doesn't have a way to set the IEdmModel. So, there is an underlying assumption here that // the model received by this method and the model passed(from configuration) while building ODataMessageWriter is the same (clr object). return(Task.Run(() => messageWriter.WriteMetadataDocument())); // TODO: add the async version in the ODL // messageWriter.WriteMetadataDocumentAsync }
public void EntityContainer_Is_Default_DoesNotShowUp_In_Metadata() { // Arrange EdmModel model = new EdmModel(); EdmEntityContainer container = new EdmEntityContainer("Default", "SampleContainer"); model.AddElement(container); // Act & Assert MemoryStream stream = new MemoryStream(); ODataMessageWriter writer = new ODataMessageWriter(new ODataMessageWrapper(stream) as IODataResponseMessage, new ODataMessageWriterSettings(), model); writer.WriteMetadataDocument(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); var containerXml = element.Descendants().SingleOrDefault(n => n.Name.LocalName == "EntityContainer"); Assert.NotNull(containerXml); Assert.Equal("SampleContainer", containerXml.Attribute("Name").Value); Assert.Null(containerXml.Attributes().FirstOrDefault(a => a.Name.LocalName == "IsDefaultEntityContainer")); }
public void EntityContainer_Is_Default_DoesNotShowUp_In_Metadata() { // Arrange EdmModel model = new EdmModel(); EdmEntityContainer container = new EdmEntityContainer("Default", "SampleContainer"); model.AddElement(container); // Act & Assert MemoryStream stream = new MemoryStream(); ODataMessageWriter writer = new ODataMessageWriter(new ODataMessageWrapper(stream) as IODataResponseMessage, new ODataMessageWriterSettings(), model); writer.WriteMetadataDocument(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); var containerXml = element.Descendants().SingleOrDefault(n => n.Name.LocalName == "EntityContainer"); Assert.NotNull(containerXml); Assert.Equal("SampleContainer", containerXml.Attribute("Name").Value); Assert.Null(containerXml.Attributes().FirstOrDefault(a => a.Name.LocalName == "IsDefaultEntityContainer")); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) #endif { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseSession(); #if NETCORE30 || NET50 app.UseRouting(); #endif // do not change the name of defaultCulture var defaultCulture = "en-US"; IList <CultureInfo> supportedCultures = new List <CultureInfo> { new CultureInfo(defaultCulture) }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture(defaultCulture), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }); #if ODATA_SERVER #if NETCORE10 // BUGS // Below fixes to make OData work properly. // None of that should be needed once Microsoft.AspNetCore.OData released. app.Use((context, func) => { System.Diagnostics.Debug.WriteLine(context.Request.Path); if (context.Request.Path.StartsWithSegments(new PathString("/MyNorthWind"), StringComparison.OrdinalIgnoreCase)) { System.Diagnostics.Debug.WriteLine("Headers for {0} ({1}):", context.Request.Path, context.Request.Headers); foreach (string key in context.Request.Headers.Keys) { System.Diagnostics.Debug.WriteLine(key + "=" + context.Request.Headers[key]); } // Case where only text/ plain and / or odata.metadata = minimal found in Accept header causing System.InvalidOperationException: No media types found in 'Microsoft.AspNetCore.OData.Formatter.ODataOutputFormatter.SupportedMediaTypes'.Add at least one media type to the list of supported media types. // Solution is to enforce simple application/json content type if (context.Request.Headers.ContainsKey("Accept")) { context.Request.Headers["Accept"] = "application/json"; } } // Fix to generate and return metadata // http://stackoverflow.com/questions/42193231/odata-v4-on-net-core-1-1-missing-metadata/43330412#43330412 if (context.Request.Path.StartsWithSegments(new PathString("/MyNorthWind/$metadata"), StringComparison.OrdinalIgnoreCase)) { var edmModel = app.ApplicationServices.GetService <Microsoft.OData.Edm.IEdmModel>(); var stream = new MemoryStream(); var message = new InMemoryMessage() { Stream = stream }; var settings = new ODataMessageWriterSettings(); var writer = new ODataMessageWriter((IODataResponseMessage)message, settings, edmModel); writer.WriteMetadataDocument(); string output = Encoding.UTF8.GetString(stream.ToArray()); return(context.Response.WriteAsync(output)); } return(func()); }); // Configuring OData app.UseOData("MyNorthWind"); #elif NETCORE20 // Configurate OData source. // http://odata.github.io/WebApi/#14-01-netcore-beta1 var builder = new ODataConventionModelBuilder(app.ApplicationServices); builder.EntitySet <Category>("Categories"); builder.EntitySet <Order>("Orders"); #endif #endif #if NETCORE30 || NET50 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "Validation", pattern: "{control}/UnobtrusiveValidation", defaults: new { controller = "Validation", action = "Register" }, constraints: new { control = "(AutoComplete)|(ComboBox)|(MultiSelect)|(^Input.*)|(MultiAutoComplete)" } ); }); #else app.UseMvc(r => { #if ODATA_SERVER && !NETCORE10 // Enable filter, order and count in OData r.Select().Expand().Filter().MaxTop(100).OrderBy().Count(); r.MapODataServiceRoute( routeName: "ODataRoute", routePrefix: "MyNorthWind", model: builder.GetEdmModel() ); r.EnableDependencyInjection(); #endif r.MapRoute( name: "Validation", template: "{control}/UnobtrusiveValidation", defaults: new { controller = "Validation", action = "Register" }, constraints: new { control = "(AutoComplete)|(ComboBox)|(MultiSelect)|(^Input.*)|(MultiAutoComplete)" } ); r.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); #endif }
public void ConvertMetadata(Uri relativeODataUri, Uri relativeSodaUri, JsonPayload jsonPayload) { var jsonObject = jsonPayload.JsonObject; var meta = jsonObject.PropertyValue<JObject>("meta"); var view = meta.PropertyValue<JObject>("view"); IList<string> fieldsToIgnore; var model = BuildModel(view, out fieldsToIgnore); var settings = new ODataMessageWriterSettings { Indent = true, }; using (var writer = new ODataMessageWriter(Message, settings, model)) { writer.WriteMetadataDocument(); } }