Я хочу создать бэкэнд на 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
пытается отправить пакетный запрос на сервер, оно может отправить запрос и получить доступ к конечной точке. правильно, ответ также успешно получен, однако существует проблема в ответе, что он будет повторять запрос снова и снова, и привязка не инициируется. Посмотрите на следующее изображение:
Прежде всего, кажется, я не единственный человек, у которого была эта проблема, например здесь У кого-то еще была такая же проблема.
Я проанализировал ответ от этого 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
. (Это только мое предположение, что это источник проблемы)
- Первый вопрос mien - как я могу изменить пакетный ответ в
ASP.NET
, чтобы добавить Content-Length
в ответе содержание также. (Обратите внимание, что в заголовке ответа есть Content-Length
, и вы видите здесь полезную нагрузку ответа или само содержимое ответа!) - Второй вопрос носит более общий характер. есть другие предложения по устранению этой проблемы?