我一直对WCF和返回类型越来越感到沮丧。 我目前正在研究一种从SQL读取数据的方法,根据检索的数据量创建某种类型的新对象,然后使用从SQL检索的数据分配对象值。
我有序列化为JSON和XML的功能。 理想情况下,我想将我的序列化对象转换为字符串,以便我可以以转换的方式从浏览器中读取响应,希望以下示例更具说明性。
当我序列化对象并返回一个流时,我得到的好处是格式化是完美的,并且它在类中使用我的DataMembers,因此JSON中的响应将如下所示:
{"GameID":1,"ProposalID":5}
然而,当我去浏览器中检索数据时,它要求我保存流文件,我在记事本中打开流来查看此结果。这并不理想,因为结果不会作为字符串出现在浏览器上。
如果我返回一个字符串,我会得到数据,但是使用DataMembers没有正确格式化或者序列化的任何优点,因此信息非常简单且无意义:
"3151"
从这个例子中可以看出,我还检索了2个每个2个变量的SQL字段。我不确定如何将结果附加到流上,因为它只返回最后一个结果(5,1),更不用说正确地返回它们了。
虽然我不确定是否可以粘贴我希望实现的内容,但无论如何它都是:http://api.justin.tv/api/user/show/justin.json
我的想法是使用XMLWriter或某种手动编写信息,但我希望能够为序列化和DataMember功能支付红利。
我的回程代码:
foreach (MatchProposal proposal in Proposals)
{
returnStream = WriteJSON(SerializeToJSON(proposal));
}
public MemoryStream SerializeToJSON(object serializeObject)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(serializeObject.GetType());
MemoryStream memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, serializeObject);
return memoryStream;
}
public Stream WriteJSON(MemoryStream memoryStream)
{
string json = Encoding.Default.GetString(memoryStream.ToArray());
return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes(json));
}
我的未完成的简单String返回代码:
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
它只返回SQL数据。
我希望我已经提供了足够的信息,告诉我到目前为止我做了什么,以及我希望从给出的例子中得到什么。 简而言之,我想实现在Justin.tv API中编写的内容,我想利用序列化,但是当我在浏览器中浏览返回流时,我会看到一个文件下载,我可以打开在记事本中,这是不理想的。
感谢任何建议,如果我似乎在某些时候迷失了,或者我可以实施的任何决议:)
此致 罗纳德
答案 0 :(得分:5)
您是否将ContentType应用于响应,例如text/xml
或text/json
?
我想这可能是问题所在。因为您返回Stream而不是对象,我认为没有指定内容类型,因此浏览器不知道如何处理它 - 这会提示下载消息。尝试添加内容类型text/json
以查看是否对问题进行排序。然后,我会检查所请求的内容类型,并让您的服务适应该匹配。
更新关于向流添加第二个对象,我建议不要尝试简单地将其添加到流的末尾。相反,为什么不构建一个复合模型,它包含两个属性,表示要从服务序列化和传回的对象?