コード例 #1
0
        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();
                    }
                });
            }
        }
コード例 #2
0
        /// <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()));
                }
        }
コード例 #3
0
        /// <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();
        }
コード例 #4
0
        /// <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();
        }
コード例 #5
0
        /// <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()));
        }
コード例 #6
0
        /// <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
        }
コード例 #7
0
        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"));
        }
コード例 #8
0
        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"));
        }
コード例 #9
0
        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
        }
コード例 #10
0
        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();
            }
        }