Как правильно обрабатывать проблемы форматирования даты JSON для служб данных WCF
Я реализовал сервис WCF Data Services следующим образом:
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class SampleService : DataService<SampleDatabase>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
// Examples:
config.SetEntitySetAccessRule("SampleData", EntitySetRights.All);
// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
config.UseVerboseErrors = true;
}
}
Однако, как было задокументировано в другом месте, даты неправильно форматируются кодом сериализации JSON фреймворка. Дата не выводится в допустимом формате ISO. Что еще более удивительно, так это то, что WCF не переносит туда и обратно дату вывода. Таким образом, он выводит дату, которая выглядит следующим образом: "/Date(1325376000000)/", но не принимает это же значение в качестве допустимой даты в ответ.
Хансельман и как исправьте это для WebAPI: http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
И я нашел аналогичные исправления для сериализации MVC: http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved-jsonvalueproviderfactory-using-json-net/
Наш клиент указал MVC3 и .NET 4, поэтому я думаю, что WebAPI отсутствует, поэтому я хотел бы решить эту проблему для MVC3 + WCF Data Services, как найдено в .NET 4. Мое понимание со стороны выше исправлений является то, что лучшее исправление заключается в использовании JSON.NET переопределение сериализации / десериализации в формате ISO понимают как .NET, так и Javascript. Но я не могу найти никаких указаний по переопределению сериализации JSON для этого.
Как можно устранить эту проблему специально для служб данных WCF в .NET 4?
1 ответ:
В OData V3 дата-время в Verbose JSON также записывается с использованием формата ISO. Для этого вам нужно будет установить WCF Data Services 5.0 (который реализует OData V3), разрешить V3 на сервере и изменить клиенты для запроса V3 (так как полезная нагрузка V2 будет иметь старый формат для обратной совместимости). Чтобы принудительно использовать формат полезной нагрузки V3, клиент может отправить заголовок MinDataServiceVersion: 3.0;.
Примечание: старый формат на самом деле делает туда и обратно, но он использует хитрый побег JSON. Фактический формат -
\/Date(12345678)\/
(который семантически совпадает с/Date(12345678)/
, но на проводе он выглядит иначе). К сожалению, такая строка не может быть создана кодом сериализации JSON в браузерах.