【发布时间】:2019-05-15 13:47:11
【问题描述】:
我在标有 [ScriptService] 的类中定义了一个 WebMethod,如下所示:
[WebMethod(enableSession: false), ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public static JsonResult ReportApplicationActivity(JsonApplicationActivityReport request, bool isTestUpload)
{ ... }
JsonApplicationActivityReport 类型的参数是一个抽象基类,可能是许多(一级)子类之一。 问题:当我从 WPF 客户端调用此 WebMethod 时,该方法永远不会被命中,并且在客户端抛出异常,说明类似于“内部服务器错误 (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(),就会触发异常。
请告诉我我在这里缺少什么:)
【问题讨论】:
标签: c# asp.net json inheritance webmethod