我一直对WCF和返回类型越来越感到沮丧.我目前正在研究一种从SQL读取数据的方法,根据检索的数据量创建某种类型的新对象,然后使用从SQL检索的数据分配对象值.
我有适当的功能来序列化为JSON和XML.理想情况下,我想将我的序列化对象转换为字符串,以便我可以以转换的方式从浏览器中读取响应,希望以下示例更具说明性.
我在序列化对象并返回流时获得的好处是格式化是完美的,并且它在类中使用我的DataMembers,因此JSON中的响应将如下所示:
{"GameID":1,"ProposalID":5}
Run Code Online (Sandbox Code Playgroud)
但是当我去浏览器中检索数据时,它会要求我保存流文件,我在记事本中打开流来查看此结果.这并不理想,因为结果不会作为字符串出现在浏览器上.
如果我返回一个字符串,我会得到数据,但是使用DataMembers没有正确格式化或者序列化的任何优点,因此信息非常简单,没有意义:
"3151"
Run Code Online (Sandbox Code Playgroud)
正如您在此示例中所看到的,我还检索了2个SQL字段,每个字段包含2个变量.我不确定如何将结果附加到流上,因为它只返回最后一个结果(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));
}
Run Code Online (Sandbox Code Playgroud)
我的未完成的简单String返回代码:
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
Run Code Online (Sandbox Code Playgroud)
它只返回SQL数据.
我希望我已经提供了足够的信息,说明我到目前为止所做的工作以及我希望从给出的例子中得到什么.简而言之,我想实现在Justin.tv API中编写的内容,我想利用序列化,但是当我在浏览器中浏览返回流时,我会看到一个文件下载,我可以打开在记事本中,这是不理想的.
感谢任何建议,如果我似乎在某些时候丢失,或任何我可以实现的决议:)
此致,罗纳德
您是否将ContentType应用于响应,例如text/xml,或text/json?
我想这可能是问题所在.因为您返回Stream而不是对象,我认为没有指定内容类型,因此浏览器不知道如何处理它 - 这会提示下载消息.尝试添加内容类型text/json以查看是否对问题进行排序.然后,我会检查所请求的内容类型,并使您的服务适应该匹配.
关于向流添加第二个对象的更新,我建议不要尝试简单地将其添加到流的末尾.相反,为什么不构建一个复合模型,它包含两个属性,表示要从服务序列化和传回的对象?