2013-06-21 2 views
0

Я начинаю эту новую нить как продолжение комментариев в: Consume Odata Service and get result in JSONНевозможно разобрать OData ответов JSON, содержащих корневое свойство «D» с помощью ФОС службы клиентского 5.3 генератора

вопрос, который я столкнулся в том, что у меня есть обновлен до служб данных wcf 5.5 и wcf client 5.3, как рекомендовано в потоке. И я пытаюсь выполнить простую запись в следующую службу JayStorm: https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/

Я генерировал ссылку обслуживания клиентов в .Net и бегаю следующий код:

using Microsoft.Data.Edm; 
using Microsoft.Data.Edm.Csdl; 
using Microsoft.Data.Edm.Validation; 
using Microsoft.Data.OData; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Spatial; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 

namespace AirportDBDataImporter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var url = "https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/"; 
      var db = new AirportDB.mydatabaseService(new Uri(url)); 
      var xmlTextReader = new XmlTextReader(url+"$metadata"); 
      IEdmModel edmModel = null; 
      IEnumerable<EdmError> errors = null; 
      if (EdmxReader.TryParse(xmlTextReader, out edmModel, out errors)) 
      { 

      } 

      db.Format.UseJson(edmModel); 

      //{"Name":"sfd","Abbrev":"sd","GeoLocation":{"type":"Point","coordinates":[-71.56236648559569,42.451074707889646],"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}}} 
      var airport = new AirportDB.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(); 


     } 
    } 
} 

EdmxReader часть необходима, потому что без он и без параметра UseJson() генерируется исключение, потому что служба не полностью совместима с odata v3. При таком подходе SaveChanges() все еще выдаёт исключение, но запись в аэропорту фактически вставляется в базу данных и возвращенную информацию для записи (от JayStorm), поскольку она содержит корневое свойство «d» старого школьного стиля, вызывает исключение синтаксического анализа и исключение выбрасывается во второй части SaveChanges().

Мой вопрос: могу ли я что-нибудь сделать для этого, чтобы полностью заполнить сообщение JayStorm? Кажется, не так, как новый wcf-клиент больше не поддерживает старый многословный json (который, как я думаю, откуда приходит «d»?).

EDIT: Вот это POST необработанные данные стельку:

POST https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/Airport HTTP/1.1 
DataServiceVersion: 3.0;NetFx 
MaxDataServiceVersion: 3.0;NetFx 
Content-Type: application/json;odata=minimalmetadata 
Accept: application/json;odata=minimalmetadata 
Accept-Charset: UTF-8 
User-Agent: Microsoft ADO.NET Data Services 
Host: open.jaystack.net 
Content-Length: 196 
Expect: 100-continue 

{"odata.type":"mydatabase.Airport","Abbrev":"Foo","GeoLocation":{"type":"Point","coordinates":[-176.64603,51.87796],"crs":{"type":"name","properties":{"name":"EPSG:4326"}}},"id":null,"Name":"Bar"} 

Вот это ответ необработанные данные от скрипача:

HTTP/1.1 201 Created 
Server: nginx/1.4.1 
Date: Fri, 21 Jun 2013 15:07:40 GMT 
Content-Type: application/json;odata=verbose;charset=utf-8;charset=UTF-8 
Content-Length: 574 
Connection: keep-alive 
X-Powered-By: Express 
Access-Control-Allow-Origin: open.jaystack.net 
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type, MaxDataServiceVersion, DataServiceVersion, Authorization, X-Domain, X-Requested-With 
Access-Control-Allow-Method: POST 
Access-Control-Allow-Methods: OPTIONS, GET, HEAD, POST, MERGE, PATCH, DELETE, PUT 
Access-Control-Allow-Credentials: true 
location: https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/Airport('NTFjNDZjM2MyMjg1Y2FiNjMzMDAwMDAx') 
Set-Cookie: connect.sid=s%3AvwHQXjoJQO3VUxJdE2jrQ3ja.A4tG9Bv4XTg1gS5xAVgxMyWXJYrV6DULf3xWvj1Uhq8; Path=/; HttpOnly 

{"d":{"__metadata":{"type":"mydatabase.Airport","id":"https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/Airport('NTFjNDZjM2MyMjg1Y2FiNjMzMDAwMDAx')","uri":"https://open.jaystack.net/c72e6c4b-27ba-49bb-9321-e167ed03d00b/6494690e-1d5f-418d-adca-0ac515b7b742/api/mydatabase/Airport('NTFjNDZjM2MyMjg1Y2FiNjMzMDAwMDAx')"},"Name":"Bar","Abbrev":"Foo","GeoLocation":{"type":"Point","coordinates":[-176.64603,51.87796],"crs":{"properties":{"name":"EPSG:4326"},"type":"name"}},"id":"NTFjNDZjM2MyMjg1Y2FiNjMzMDAwMDAx"}} 

Благодарности

+0

Мое предположение заключается в том, что служба отвечает либо неправильными, либо отсутствующими заголовками DataServiceVersion и Content-Type. Но чтобы подтвердить это, не могли бы вы получить ответ от службы, включая HTTP-заголовки, и опубликовать ее здесь? –

+0

Я отредактировал вопрос inline, чтобы включить исходный запрос и ответные исходные данные, включая заголовки. – t316

ответ

0

Как обсуждалось в комментариях другой поток, ваш сервер не поддерживает V3 OData, и он также, похоже, не подходит должным образом, когда вы запрашиваете новый формат JSON. В запросе полезной нагрузки вы говорите, что понимаете только application/json;odata=minimalmetadata, но сервер игнорирует ограничение odata=minimalmetadata и отвечает в любом случае application/json;odata=verbose.

Вы управляете этим сервером? Я бы посмотрел, как это можно обновить для работы с v3 OData.

Как вы уже указали, клиент служб данных WCF не будет работать с JSON Verbose. Проблема заключается не только в обертке «d»; есть тонны различий между этими двумя форматами, и клиент WCF DS просто не может понять старый формат (и никогда не был в состоянии).

Если это вообще возможно, я настоятельно рекомендую обновить сервер. Если вы не можете обновить сервер, вы все равно можете использовать Atom с клиентом служб данных WCF и сервером v2. Это будет означать большее количество байтов на проводе, но если уменьшить размер полезной нагрузки на проводе, это то, о чем вас беспокоит, это еще больше оснований для обновления сервера и использования нового формата JSON, который гораздо более краток, чем старый формат ,