Использование UI5 с ASP. Net oData back-end - PullRequest
1 голос
/ 16 апреля 2020

Я хочу создать бэкэнд на ASP.NET Web Application API для SAPUI5 фронтэнда.

Внешний интерфейс очень прост и прекрасно работает с mock-сервером и не имеет проблем с внутренним mock-сервером.

Однако я хочу использовать приложение с настоящим ASP.NET внутренним сервером.

Я использовал этот урок для создания внутреннего сервера ASP.NET.

Единственная часть, которая немного отличается от исходного урока, это WebAppConfig.cs файл, который я открыл здесь:

using CimplySkills_Backend.Models;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.Data.Edm;
using Microsoft.Data.Edm.Csdl;
using Microsoft.OData.Edm.Csdl;
using System.Web.Http.OData.Batch;
using System.Web.Http.OData.Builder;
using System.Web.Http.OData.Extensions;
using System;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;

namespace CimplySkills_Backend
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // allow CORS
            var cors = new EnableCorsAttribute("*", "*", "*", "*");
            config.EnableCors(cors);

            // Web-API-Routen
            config.MapHttpAttributeRoutes();

            // define HTTP access
            /*
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            */
            // enable batch
            var odataBatchHandler = new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer);

            // enable queries
            config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();

            // set entities
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<CountriesSet>("CountriesSet");
            builder.Entity<LocationsSet>().HasOptional(x => x.Country).CascadeOnDelete(false);


            //Define version
            Version odataVersion2 = new Version(2, 0);
            builder.DataServiceVersion = odataVersion2;
            builder.MaxDataServiceVersion = odataVersion2;

            IEdmModel edmModel = builder.GetEdmModel();
            edmModel.SetEdmVersion(odataVersion2);
            edmModel.SetEdmxVersion(odataVersion2);

            config.Routes.MapODataServiceRoute(
                routeName: "ODataRoute",
                routePrefix: "sap/opu/odata/cimtag/ODATA_SKILLS_SRV/",
                // routePrefix: null,
                model: edmModel,
                batchHandler: odataBatchHandler);

            // resolve "No non-OData HTTP route registered"
            // config.EnableDependencyInjection();
        }
    }
}

Теперь проблема в том, что приложение UI5 пытается отправить пакетный запрос на сервер, оно может отправить запрос и получить доступ к конечной точке. правильно, ответ также успешно получен, однако существует проблема в ответе, что он будет повторять запрос снова и снова, и привязка не инициируется. Посмотрите на следующее изображение:

Batch request from UI5 to ASP.NET

Прежде всего, кажется, я не единственный человек, у которого была эта проблема, например здесь У кого-то еще была такая же проблема.

Я проанализировал ответ от этого ASP.NET сервера с тем же пакетным ответом на сервер SAP ABAP (который является стандартным внутренним сервером для SAPUI5 приложений), и есть несколько отличий.

Например, здесь пакетный ответ в SAP:

--BD335BC5DB87B4F290C21DB6C0A9D3650
Content-Type: application/http
Content-Length: 538
content-transfer-encoding: binary

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 347
dataserviceversion: 2.0
sap-metadata-last-modified: Tue, 07 Apr 2020 13:02:03 GMT
cache-control: no-store, no-cache

{
"d":{
    "__metadata":{
            "id":"https://xyz.de:5698/sap/opu/odata/sap/ZMJZ_ODATA_COMMON_SRV/AuthSet'ZMJZ_SECTY')",                            "uri":"https://xyz.de:5698/sap/opu/odata/sap/ZMJZ_ODATA_COMMON_SRV/AuthSet'ZMJZ_SECTY')",                           "type":"ZMJZ_ODATA_COMMON_SRV.Auth"
        },
    "Object":"ZMJZ_SECTY",
    "FlagCreate":true,
    "FlagRead":true,
    "FlagUpdate":true,
    "FlagDelete":true
    }
}
--BD335BC5DB87B4F290C21DB6C0A9D3650--

А здесь пакетный ответ от ASP.NET:

--batchresponse_988aa133-3a4a-413c-9109-f5f7786e7e78
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DataServiceVersion: 2.0
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: *

{
  "d":{
    "results":[
      {
        "__metadata":{

        },"ID":1,"name":"Germany"
      },{
        "__metadata":{

        },"ID":2,"name":"France"
      },{
        "__metadata":{

        },"ID":3,"name":"Iran"
      },{
        "__metadata":{

        },"ID":4,"name":"USA"
      }
    ]
  }
}
--batchresponse_988aa133-3a4a-413c-9109-f5f7786e7e78--

Если мы посмотрим внимательно, мы смотрите, что есть свойство Content-Length, которое появляется два раза в ответе SAP, в то время как его вообще нет в ответе ASP.NET. (Это только мое предположение, что это источник проблемы)

  1. Первый вопрос mien - как я могу изменить пакетный ответ в ASP.NET, чтобы добавить Content-Length в ответе содержание также. (Обратите внимание, что в заголовке ответа есть Content-Length, и вы видите здесь полезную нагрузку ответа или само содержимое ответа!)
  2. Второй вопрос носит более общий характер. есть другие предложения по устранению этой проблемы?
...