Я вижу типы 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 разбиты на массив сегментов.