Mam aplikację sieci web ASP.NET 3.5 SP1, który używa niestandardowego JavaScriptConverter. Kod używany do pracy w przeszłości, ale przestał działać. Nie wiem, co się stało po środkowej stronie serwera. Problemem, który teraz widzimy, jest to, że konwerter nie jest wywoływany, więc dostaję błędy, że System.Data.DataRow nie może być serializowany.ASP.NET Javascript Converter nie wydaje się być wywoływana
Oto odnośny fragment web.config:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview" />
<add name="DataRowConverter" type="WebUI.DataRowConverter, WebUI.DataRowConverter, Version=1.1.0.323, Culture=neutral" />
<add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview" />
</converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>
przycięta wersja klasy wygląda następująco (przycięta tylko uniknąć marnowania miejsca na zbędnymi realizacji):
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Web.Script.Serialization;
namespace WebUI {
public class DataRowConverter : JavaScriptConverter {
private ReadOnlyCollection<Type> _supportedTypes = new ReadOnlyCollection<Type>(new Type[] { typeof(DataRow) });
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) {
// stuff
return dr;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) {
// stuff
return dictionary;
}
public override IEnumerable<Type> SupportedTypes {
get {
return this._supportedTypes;
}
}
}
}
Wydaje się, że klasa rzeczywiście jest ładowana (jeśli wyjmujemy ją z pliku web.config i referencje projektu, nie ma żadnych punktów przerwania, należy ją ponownie umieścić w pliku web.config i skopiować ręcznie DLL/PDB lub dodać do projektu dostępne są punkty przerwania), ale nie jest g użyty własciwie. Żaden punkt przerwania w klasie nie jest trafiony i nie są zgłaszane żadne wyjątki (w tym jeden rzutowany w konstruktorze, aby zobaczyć, co się dzieje). Wygląda na to, że klasa jest ładowana, ale nigdy nie jest wywoływana.
Jest to na IIS 7.5 i IIS 7.0 w trybie zintegrowanym, jeśli ma to znaczenie.
Ktoś ma jakieś pomysły?
@MikeBaz - należy zaznaczyć swoją odpowiedź jako zaakceptowaną. Jest poprawna. –