我有一个RESTful Web服务,它返回JSON序列化数据。它可以成功序列化Dictionary<string, string>
对象,但我希望每个函数都能够返回Dictionary<string, object>
。
当我返回Dictionary<string, string>
时,我得到了预期的JSON响应。但是当我尝试返回Dictionary<string, object>
时,我得到了这个回复:
ReadResponse()失败:服务器没有为此返回响应 请求。
所以,关于代码! 以下是失败的Dictionary<string, object>
代码:
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, object> Test(String Token, String Id)
{
Dictionary<string, object> testresults = new Dictionary<string, object>();
testresults.Add("Test1Key", "Test1Value");
Dictionary<string, string> innertestresults = new Dictionary<string, string>();
innertestresults.Add("InnerTest1Key", "InnerTest1Value");
innertestresults.Add("InnerTest2Key", "InnerTest2Value");
testresults.Add("Test2Key", innertestresults);
return testresults;
}
而且,只是为了踢/参考,这里是完美运行的Dictionary<string,string>
代码:
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, string> Test(String Token, String Id)
{
Dictionary<string, string> testresults = new Dictionary<string, string>();
testresults.Add("Test1Key", "Test1Value");
testresults.Add("Test2Key", "Test2Value");
testresults.Add("Test3Key", "Test3Value");
return testresults;
}
如果有人有任何关于如何使其发挥作用的想法(或任何其他方法来达到相同的最终结果),请告诉我!我对如何做到这一点非常开放。
关于使用的主题 ...我需要混音的原因是我可以返回这样的结果(“数据”部分可能是任何东西......不一定是密钥ID,类型和MaxUsers):
{"Status":"Success","Data":{"ID":"1234","Type":"Live","MaxUsers":"5"}}
{"Status":"Failure","Error":"ID does not exist"}
非常感谢你们!
答案 0 :(得分:3)
我可以重新创建您遇到的错误,但是没有幸运获得服务来自动序列化Dictionary<string, object>
对象。
一种解决方法是使用JavaScriptSerializer类在代码中序列化对象,并返回结果字符串,如下所示:
using System.Web.Script.Serialization;
...
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string Test(String Token, String Id)
{
Dictionary<string, object> testresults = new Dictionary<string, object>();
testresults.Add("Test1Key", "Test1Value");
Dictionary<string, string> innertestresults = new Dictionary<string, string>();
innertestresults.Add("InnerTest1Key", "InnerTest1Value");
innertestresults.Add("InnerTest2Key", "InnerTest2Value");
testresults.Add("Test2Key", innertestresults);
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(testresults);
return json;
}
希望这会有所帮助。
修改(根据评论)
好的,花了一点时间研究这个,似乎你需要明确声明使用ServiceKnownType属性进行序列化时对象图中会出现的类型。
ServiceKnownType需要添加为您服务的属性,在您的情况下,您需要声明Dictionary<string, string>
类型,如下所示:
[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceContract(Namespace = "WebApplication1")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service...
答案 1 :(得分:0)
我正在敲打类似的问题,当服务执行时没有任何异常,但是ajax调用没有执行成功方法,并且在每个浏览器中,错误消息不一致。
当我回到词典时。我的对象类有一些DateTime类型的属性。我在谷歌上发现了很少关于JSON和C#中的DateTime格式的帖子。我将这些属性从DateTime更改为string并工作。
问候。