Сериализация JSON типа URI в проекте ODATA 3 C # WebAPI 2 - PullRequest
0 голосов
/ 15 мая 2018

Я вижу типы URI C #, сериализованные в JSON, в контроллере ODATA 3 в моем проекте WebAPI 2 в виде массива сегментов, не включающего домен. Я перепробовал все, что мог придумать, чтобы изменить это (в том числе возиться с настройками сериализации и даже попробовать контрактный сериализатор вместо JSON.Net). Ничто, кажется, не меняет поведение. Обратите внимание, я не использую .Net Core. Вот пример кода, собранного в единый фрагмент.

namespace WebApplication1.Controllers
{
    public class MyObject
    {
        public Uri Url { get; set; }

        public string Name { get; set; }

        public string ID { get; set; }
    }

    public class MyObjectsController : ODataController
    {
        private static ODataValidationSettings _validationSettings = new ODataValidationSettings();

        public IHttpActionResult GetMyObjects(ODataQueryOptions<MyObject> queryOptions)
        {
            try
            {
                queryOptions.Validate(_validationSettings);

                return Ok<IEnumerable<MyObject>>(new List<MyObject>() { new MyObject() { ID="asdf", Name="123rwe", Url = new Uri("http://www.webapp.com/sites/page.html") } });
            }
            catch (ODataException ex)
            {
                return BadRequest(ex.Message);
            }
        }

    }
}

В браузере создается следующий JSON:

{
  "odata.metadata":"http://localhost:51607/odata/$metadata#MyObjects","value":[
    {
      "Url":{
        "Segments":[
          "/","sites/","page.html"
        ]
      },"Name":"123rwe","ID":"asdf"
    }
  ]
}

Это то, что я хотел бы (без изменения свойства Url на строку):

{
  "odata.metadata":"http://localhost:51607/odata/$metadata#MyObjects","value":[
    {
      "Url":"http://www.webapp.com/sites/page.html","Name":"123rwe","ID":"asdf"
    }
  ]
}

Есть мысли?

UPDATE: Дальнейшие исследования предполагают, что поведение сериализации для типов URI в ODAP WebAPI контролируется классами odataentityreferencelink и odataentityreferencelinkserializer. В частности, тип URI, по-видимому, преобразуется в типы ссылок odataentityreference, которые затем сериализуются так, как я разместил выше (как массив сегментов, не включающий корневой домен). Мне все еще нужно знать, как изменить это поведение, однако документация для этих двух классов не оказывается полезной. Наконец, я подтвердил, что эта проблема не относится к выходному формату JSON. Поведение сериализации для XML / Atom и JSON одинаково: URI разбиты на массив сегментов.

1 Ответ

0 голосов
/ 07 июня 2018

Служба поддержки MS Premier предоставила окончательный ответ на этот вопрос, которым я поделюсь ниже.

  1. Нет возможности напрямую JSON-сериализовать тип URI, обычно он будет разбит на массив сегментов, как вы наблюдаете в своем коде
  2. Доменное имя будет исключено как обычный сценарий
  3. Опция, к которой вы можете обратиться, - это создать пользовательский URI-конвертер, производный от JSONConverter, который является частью пространства имен Newtonsoft.Json
...