Несовместимость типа данных GeoLocation между службой odata и созданным .Net прокси-сервером на стороне клиента

Я пытаюсь проверить концепцию с помощью функции облачной базы данных JayStorm, совместимой с odata. Пока все идет отлично, но у меня есть одна большая проблема, которая подходит под категорию сериализации прокси клиента службы odata.

Мой URL-адрес службы odata: https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/

Я создаю простое консольное приложение .Net и добавляю ссылку на эту службу. На первый взгляд все выглядит нормально, однако существует несовместимость между типом данных на стороне сервера для GeoLocation (полезная нагрузка json: {"type":"Point","coordinates":[-71.56236648559569,42.451074707889646],"crs":{ "properties":{"name":"EPSG:4326"}) и тип на стороне клиента, выбранный мастером добавления ссылки. Кажется, что это очень разные типы данных, и просто запросы на выборку на стороне клиента или вставка/обновление на стороне клиента не работают. Например, приведенный ниже код создает исключение в строке SaveChanges();

System.Data.Services.Client.DataServiceRequestException was unhandled
  HResult=-2146233079
  Message=An error occurred while processing this request.
  Source=Microsoft.Data.Services.Client
  StackTrace:
       at System.Data.Services.Client.SaveResult.HandleResponse()
       at System.Data.Services.Client.BaseSaveResult.EndRequest()
       at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
       at System.Data.Services.Client.DataServiceContext.SaveChanges()
       at JumpSeatDataImporter.Program.Main(String[] args) in c:\Projects\JumpSeat\Dev\JumpSeatWeb\JumpSeatDataImporter\Program.cs:line 24
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Data.Services.Client.DataServiceClientException
       HResult=-2146233079
       Message=Format Exception: Invalid 'Point' format!
    at Function.$data.GeographyBase.validateGeoJSON (/usr/lib/node_modules/jaydata/lib/TypeSystem/Types/Geography.js:75:29)
    at GeographyPoint.GeographyBase (/usr/lib/node_modules/jaydata/lib/TypeSystem/Types/Geography.js:6:25)
    at new GeographyPoint (/usr/lib/node_modules/jaydata/lib/TypeSystem/Types/Geography.js:94:29)
    at $data.oDataConverter.fromDb.$data.GeographyPoint (/usr/lib/node_modules/jaydata/lib/Types/StorageProviders/oData/oDataConverter.js:55:64)
    at Airport.$data.Entity.$data.Class.define.constructor (/usr/lib/node_modules/jaydata/lib/Types/Entity.js:189:41)
    at Airport.Entity (eval at <anonymous> (/usr/lib/node_modules/jaydata/lib/TypeSystem/TypeSystem.js:463:20))
    at new Airport (eval at <anonymous> (/usr/lib/node_modules/jaydata/lib/TypeSystem/TypeSystem.js:463:20))
    at EntitySetProcessor.$data.Class.define.invoke (/usr/lib/node_modules/jaydata/lib/JayService/OData/EntitySetProcessor.js:61:38)
    at JSObjectAdapter.$data.Class.define.processRequest (/usr/lib/node_modules/jaydata/lib/JayService/JSObjectAdapter.js:89:37)
    at JSObjectAdapter.$data.Class.define.handleRequest (/usr/lib/node_modules/jaydata/lib/JayService/JSObjectAdapter.js:165:26)
       StatusCode=500
       InnerException: 

Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Spatial;
using System.Text;
using System.Threading.Tasks;

namespace AirportDataImporter
{
    class Program
    {
        static void Main(string[] args)
        {
            var db = new AirprotDB.mydatabaseService(new Uri("https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/"));

            //{"Name":"sfd","Abbrev":"sd","GeoLocation":{"type":"Point","coordinates":[-71.56236648559569,42.451074707889646],"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}}}

            var airport = new JumpSeatDB.Airport();
            airport.Abbrev = "Foo";
            airport.Name = "Bar";

            airport.GeoLocation = GeographyPoint.Create(51.87796, -176.64603);
            db.AddToAirport(airport);

            db.SaveChanges();

            //var foo = db.Airport.ToList();


        }
    }
}

Что я могу сделать, чтобы прокси-сервер на стороне клиента использовал подходящий (объявленный пользователем?) класс, который позволит мне передавать данные туда и обратно, включая свойство GeoLocation? Без этого я не могу загружать/обновлять данные с сервера sql и файлы в JayStorm...

Вы должны иметь возможность полностью эмулировать мою проблему, добавив службу в консольное приложение и запустив приведенный выше код. Не бойтесь испортить данные.

Спасибо


person t316    schedule 17.06.2013    source источник


Ответы (1)


Геотипы сейчас доступны только в формате JSON (это может измениться в среднесрочной перспективе), а .NET по умолчанию использует XML, что оставляет три варианта:

  • заставить ваше приложение .NET работать в формате JSON с клиентом служб данных 5.5.0 и инструментами служб данных 5.3 (это создает новый прокси-сервер, который принимает свойство Format в контексте) - мне не удалось добиться этого в .NET , но я надеюсь, что вы лучше меня :)
  • вы используете страницу HTML5 или node.js для импорта ваших POI с библиотекой JayData
  • вы отправляете файл csv в службу службы JayStorm, которая обрабатывает файл. Вы публикуете операцию службы с помощью HttpRequest
person Robesz    schedule 18.06.2013
comment
рассмотрите возможность пейджинга загрузки и вставок. Обычно мы используем чанки с 200 записями. - person Robesz; 18.06.2013
comment
Просмотрите этот комментарий: stackoverflow.com/questions/17059864/ - person t316; 18.06.2013
comment
Я обновил клиент служб данных и продвинулся намного дальше, однако теперь, похоже, возникла проблема соответствия odata v3 службе JayStorm. Вы можете прочитать мой прогресс в разделе комментариев к этому сообщению SO, и вы можете увидеть последний комментарий у кого-то, кто, кажется, хорошо разбирается в этом вопросе: stackoverflow.com/questions/17059864/ - person t316; 19.06.2013