2013-03-28 38 views
0

有沒有簡單的方法來使用ASP.NET Web API的默認序列化程序?ASP.NET Web API:使用默認序列化器

礦被配置在時尚WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

它完美。我想要做的是在特定情況下手動使用相同的序列化程序。如果由於配置更改的某些原因,手動序列化必須反映這些更改,而不必關心它。

爲了更準確地說明我的意圖,我想在將它們保存到數據庫後將新的資源發送到SignalR Hub。它們需要以與ASP.NET Web API在使用GET請求時完全相同的方式進行序列化。

+0

我不是這部分明確表示:「使用在特定情況下手動完全相同的串行器「。根據上述細節,您正在設置全局格式化程序。關於「向SignalR Hub發送新資源」,你最近怎麼做? (就像你使用httpclient,你想使用json格式化程序)..很抱歉的很多問題.. –

+0

無論如何,如果有人發佈資源,它需要廣播給每個需要保持更新的SignalR用戶以現場時尚。此過程必須使用Web API始終使用的相同序列化配置。 – RooSoft

+0

好的。 client1(帖子資源) - >服務(廣播) - > client2,client3,clientn。在這個設置中,服務是一個具有上面提到的串行器設置的webapi。因爲這些設置是全局格式化程序,所以當資源被廣播到client2和client3時,它們應該使用相同的全局格式化程序設置...我是否在朝着正確的方向思考? –

回答

0

我發現基於這個錯誤報告的解決方案:https://github.com/SignalR/SignalR/issues/500

首先,創建一個自定義IContractResolver

public class SignalRContractResolver : IContractResolver 
{ 
    private readonly Assembly _assembly; 
    private readonly IContractResolver _camelCaseContractResolver; 
    private readonly IContractResolver _defaultContractSerializer; 

    public SignalRContractResolver() 
    { 
     _defaultContractSerializer = new DefaultContractResolver(); 
     _camelCaseContractResolver = new CamelCasePropertyNamesContractResolver(); 
     _assembly = typeof(Connection).Assembly; 
    } 

    public JsonContract ResolveContract(Type type) 
    { 
     if (type.Assembly.Equals(_assembly)) 
      return _defaultContractSerializer.ResolveContract(type); 

     return _camelCaseContractResolver.ResolveContract(type); 
    } 
} 

接下來,在ApplicationStart註冊它

var settings = new JsonSerializerSettings(); 
    settings.Converters.Add(new StringEnumConverter()); 
    settings.ContractResolver = new SignalRContractResolver(); 

    var serializer = new JsonNetSerializer(settings); 

    GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer),() => serializer); 

感謝halter73指引我在正確的方向!

+0

「組件= typeof(Connection).Assembly; 」中的連接是什麼。我找不到它 – mister

0

你可以註冊自己的IJsonSerializer與應用SignalR的依賴解析器開始使用您的自定義JSON.NET串行設置。

//... 
using Microsoft.AspNet.SignalR.Json; 
using Newtonsoft.Json; 

//... 

    protected void Application_Start(object sender, EventArgs e) 
    { 

     var settings = new JsonSerializerSettings(); 
     settings.Converters.Add(new StringEnumConverter()); 
     settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

     var serializer = new JsonNetSerializer(settings); 

     GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer),() => serializer); 

     RouteTable.Routes.MapHubs(); 

     //... 
+0

這是一個非常有趣的方法......目前,如果我評論此塊(不包括MapHubs),它將輸出Pascal案例中的數據。一旦我取消註釋,客戶端就會完全停止接收事件。 – RooSoft

+0

我發現問題來自ContractResolver設置。只需評論這一行,系統就可以工作,但顯然仍然在PascalCase中。 – RooSoft

0

我發現這和它的正常工作

var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
formatter.SerializerSettings = new JsonSerializerSettings 
{ 
    Formatting = Formatting.Indented, 
    TypeNameHandling = TypeNameHandling.Objects, 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
}; 

這是必須被放置在「的Application_Start」「的Global.asax.cs」文件功能