OData v4.0 - изменить значение на результаты - PullRequest
2 голосов
/ 04 апреля 2019

Я сейчас пишу API, но на этот раз клиентская сторона - третья сторона. К счастью, это хорошо задокументировано, но у меня есть 1 конкретная проблема. Клиент ожидает JSON, как это:

{      "results":[         {            "Id":"2C9E76EF-2532-4CA5-B4C6-03E39A31867A",          "Code":1,          "Name":"Optimizers B.V.",          "VatCode":"96541122",          "ChamberOfCommerceCode":"28084551",          "LanguageCode":"NL",          "Discount":2.35,          "CustomerManager":"Robin van Halen",          "PriceList":"7208812F-EEDA-4345-B3C6-1F1A960558C1",          "PaymentCondition":"7BA77586-3A3A-4D07-8DB8-2188F48BD68A",          "VatLiable":true       }}

Я использую OData, так как мне нужно было использовать OData для опций с запросом. Тем не менее, мой набор результатов совсем другой:

{
    "@odata.context": "http://localhost:52973/odata/$metadata#Customers",
    "value": [ {            "Id":"2C9E76EF-2532-4CA5-B4C6-03E39A31867A",          "Code":1,          "Name":"Optimizers B.V.",          "VatCode":"96541122",          "ChamberOfCommerceCode":"28084551",          "LanguageCode":"NL",          "Discount":2.35,          "CustomerManager":"Robin van Halen",          "PriceList":"7208812F-EEDA-4345-B3C6-1F1A960558C1",          "PaymentCondition":"7BA77586-3A3A-4D07-8DB8-2188F48BD68A",          "VatLiable":true       }}

Разница

"@odata.context": "http://localhost:52973/odata/$metadata#Customers",
"value": [ ....

Я задал вопрос в службу поддержки, и они ответили, что мне нужно изменить значение на результаты, чтобы оно работало. Но как мне это изменить? Я не совсем уверен, как это сделать.

Я попробовал какой-нибудь грязный хак, как это:

 public IQueryable<Customer> Get()
        {
            var AllCusts = GetAllCustomers(); //this is of type IQueryable
            //Test in order to change value to results

            var x = JsonConvert.SerializeObject(AllCusts, Formatting.Indented);
            var xyz = JsonConvert.DeserializeObject<List<Customer>>(x.Replace("value", "Results"));

            var asQuery = xyz.AsQueryable();


            return asQuery;
        }

Но, к сожалению, набор результатов остается прежним.

1 Ответ

0 голосов
/ 05 апреля 2019

Чтобы кому-то еще по какой-то причине пришлось переименовать значение ... вот как мне удалось это сделать:

   // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            // Add middleware before MVC
            app.Use(async (ctx, next) =>
            {
                // Capture the original response body stream
                var responseStream = ctx.Response.Body;

                // Replace it with our own, so that we can read it
                using (var bodyStream = new MemoryStream())
                {
                    ctx.Response.Body = bodyStream;


                    // Run ASP.NET MVC (ie. get the results back from your code)
                    await next();

                    // Put the original response body stream back
                    ctx.Response.Body = responseStream;

                    // Read the one that we captured
                    bodyStream.Seek(0, SeekOrigin.Begin);
                    var responseBody = await new StreamReader(bodyStream).ReadToEndAsync();

                    // If it's ODATA & JSON & 200 (success), replace the "value" with "results"
                    if (ctx.Response.ContentType.Contains("application/json") && ctx.Response.ContentType.Contains("odata") && ctx.Response.StatusCode == 200)
                    {
                        responseBody = responseBody.Replace("\"value\"", "\"results\"");
                    }

                    // Write back the response body (whether modified or not) to the original response stream
                    await ctx.Response.WriteAsync(responseBody);
                }
            });
...