2012-03-22 22 views
8

Tôi đang cố sử dụng gói gói NETFx Json.NET MediaTypeFormatter để hoán đổi DataContractJsonSerializer mặc định trong dịch vụ WCF REST của tôi (khung 4.0). Tôi đã tải xuống gói trong dự án của mình và thêm các dòng mã sau vào tệp Global.asax.Trình nối tiếp JSON.NET cho các Dịch vụ REST của WCF

void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(); 

     // Create Json.Net formatter serializing DateTime using the ISO 8601 format 
     var serializerSettings = new JsonSerializerSettings(); 
     serializerSettings.Converters.Add(new IsoDateTimeConverter()); 

     var config = HttpHostConfiguration.Create(); 
     config.Configuration.OperationHandlerFactory.Formatters.Clear(); 
     config.Configuration.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings)); 
    } 

Nhưng khi tôi chạy dịch vụ, nó vẫn sử dụng DataContractJsonSerilizer để tuần tự hóa. Dưới đây là lớp tôi đang trở về từ dịch vụ của tôi.

[DataContract] 
public class SampleItem 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string StringValue { get; set; } 

    [DataMember] 
    public DateTime DateTime { get; set; } 
} 

Dưới đây là phản hồi từ dịch vụ trong Fiddler.

enter image description here

Bạn có thể thấy rằng DateTime không có trong định dạng ISO mà tôi đã xác định trong serializerSettings trong đoạn code trên. Điều này cho tôi biết rằng serializer JSON.NET không được sử dụng để tuần tự hóa các đối tượng.

Sẽ đánh giá cao bất kỳ trợ giúp nào.

Trả lời

6

Tôi cảm thấy câm lặng sau khi tôi đã tìm ra câu trả lời. Xảy ra vào những thời điểm :). Tôi đã phải thêm cấu hình vào RouteTable. Dưới đây là mã trong Global.asax

public class Global : HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(); 
    } 

    private void RegisterRoutes() 
    { 
     // Create Json.Net formatter serializing DateTime using the ISO 8601 format 
     var serializerSettings = new JsonSerializerSettings(); 
     serializerSettings.Converters.Add(new IsoDateTimeConverter()); 

     var config = HttpHostConfiguration.Create().Configuration; 
     config.OperationHandlerFactory.Formatters.Clear(); 
     config.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings)); 

     var httpServiceFactory = new HttpServiceHostFactory 
            { 
             OperationHandlerFactory = config.OperationHandlerFactory, 
             MessageHandlerFactory = config.MessageHandlerFactory 
            }; 

     RouteTable.Routes.Add(new ServiceRoute("Service1", httpServiceFactory, typeof(Service1))); 
    } 
} 

Hy vọng nó sẽ giúp ai đó nếu họ tình cờ gặp phải tình huống tương tự.

+2

Thực ra tôi đã xảy ra với kịch bản tương tự, nhưng các dịch vụ WCF của tôi được lưu trữ trong Windows Service. Đoạn mã trên ném ngoại lệ sau: "System.InvalidOperationException: 'ServiceHostingEnvironment.EnsureServiceAvailable' không thể được gọi trong môi trường lưu trữ hiện tại. API này yêu cầu ứng dụng gọi được lưu trữ trong IIS hoặc WAS." Bất kỳ ý tưởng nào? –

Các vấn đề liên quan