У меня есть WebMethod, определенный в классе, помеченном [ScriptService] следующим образом:
[WebMethod(enableSession: false), ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public static JsonResult ReportApplicationActivity(JsonApplicationActivityReport request, bool isTestUpload)
{ ... }
Параметр типа JsonApplicationActivityReport является абстрактным базовым классом и может быть одним из многих(уровень-1) дочерние классы.Проблема: когда я вызываю этот WebMethod из клиента WPF, метод никогда не срабатывает, и на стороне клиента выдается исключение, сообщающее что-то вроде «Внутренняя ошибка сервера (500)».
Моя конфигурация в Global.asax:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.SerializationBinder = new JsonApiUtils.InheritanceSerializationBinder();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
Поэтому я пытаюсь указать сериализатору JSON использовать пользовательский SerializationBinder, где я разрешаю наследование.Это выглядит так:
public class InheritanceSerializationBinder : DefaultSerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
switch (typeName)
{
case "JsonMeasurementActivityReport[]": return typeof(JsonMeasurementActivityReport[]);
case "JsonMeasurementActivityReport": return typeof(JsonMeasurementActivityReport);
case "JsonSimulationActivityReport[]": return typeof(JsonSimulationActivityReport[]);
case "JsonSimulationActivityReport": return typeof(JsonSimulationActivityReport);
default: return base.BindToType(assemblyName, typeName);
}
}
}
Но метод BindToType () никогда не вызывается во время запроса.Я также включил трассировку в Web.config и вижу, что запросы (по 2 на вызов по любой причине ...) поступают на сервер, но в файле /trace.axd нет сообщений об ошибках или чего-либо, что мне помогает.
Наконец, мой клиентский код выглядит следующим образом:
JsonApplicationActivityReport request = new JsonApplicationActivityReport () {...};
HttpWebRequest webRequest = GetWebRequest(Endpoints.ReportApplicationActivity);
using (var writer = webRequest.GetRequestStream())
{
string jsonRequest = JsonConvert.SerializeObject(new { request = request, isTestUpload = isTestUpload }, Formatting.Indented, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); //also includes type information when serializing to JSON (required because the server expects an abstract class that has to be deserialized into the actual child activity class)
byte[] requestData = Encoding.UTF8.GetBytes(jsonRequest);
writer.Write(requestData, 0, requestData.Length);
}
var webResponse = (HttpWebResponse)webRequest.GetResponse();
var responseStream = new StreamReader(webResponse.GetResponseStream());
Как только вызывается GetResponse () , возникает исключение.
Пожалуйста, скажите мне, что мне здесь не хватает:)