我有一个Web服务,该服务只能捕获入站数据。如果传入数据是一个串联的JSON数组,则sever将返回500级错误:
ExceptionType : "System.InvalidOperationException"
Message: "Type 'System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not supported for deserialization of an array."
at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList)
.........
我进行了一些测试,这与Stringified JSON数组中的括号有关。发送字符串的JSON对象(只是卷发括号)不会引起任何错误。IE。"{"id":111,"val":"x"}"
与"[{"id":111,"val":"x"}]"
让我感到困惑的是,我没有在Web方法中进行任何避免。 在我访问请求之前,这一切都发生在上游。网络方法如下:
[WebMethod]
[ScriptMethod]
public void CatchData()
{
HttpRequest inboundRequest = HttpContext.Current.Request;
System.IO.Stream stream = inboundRequest.InputStream;
stream.Position = 0;
string contents = "";
using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8))
{
contents = reader.ReadToEnd();
}
}
两个问题:
我需要更改什么,以便Web方法可以处理Stringified JSON中的括号?
到底发生了什么?我花了一段时间才意识到httpcontext.current.requrest.inputstream正在使用Web方法的某些东西使用,因此要重新阅读其内容,我需要将其位置设置为0。设置为应用程序/JSON吗?如果将内容类型设置为应用程序/文本,则无需重置流。
您显然在上游中配置了一个正在读取请求的处理程序。我想象WebMethod或ScriptMethod正在添加处理程序,尽管如果您在一个复杂的项目中,Httphandler可能会发挥作用。不知道您的整个解决方案,就不可能一个更好的答案。
如果您只想处理任何原始输入,请构建并注册httphandler。