Как правильно обрабатывать проблемы форматирования даты 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 2

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 в браузерах.