【问题标题】:WCF returning Streams or Strings?WCF 返回流或字符串?
【发布时间】:2012-01-04 17:11:55
【问题描述】:

我一直对 WCF 和返回类型感到越来越沮丧。 我目前正在研究一种方法,它从 SQL 读取数据,根据检索到的数据量创建某种类型的新对象,然后用从 SQL 检索到的数据分配对象值。

我有序列化为 JSON 和 XML 的功能。 理想情况下,我想将我的序列化对象转换为字符串,以便我可以以转换后的方式从浏览器中读取响应,希望以下示例更能说明问题。

当我序列化我的对象并返回一个流时,我得到的好处是格式是完美的,它在类中使用了我的 DataMembers,因此 JSON 中的响应如下所示:

{"GameID":1,"ProposalID":5}

但是,当我在浏览器中检索数据时,它要求我保存流文件,我在记事本中打开流以查看此结果。这并不理想,因为结果不会作为字符串出现在浏览器上。

如果我返回一个字符串,我会得到数据,但是它没有使用 DataMembers 或序列化的任何优势正确格式化,因此信息非常简单且没有意义:

"3151"

从这个例子可以看出,我还检索了 2 个 SQL 字段,每个字段有 2 个变量。而且我不确定如何将结果附加到流中,因为目前它只返回最后一个结果 (5,1),更不用说正确返回它们了。

虽然我不确定是否可以粘贴我想要实现的东西的 url,但无论如何都可以在这里: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));
}

还有我未完成的简单字符串返回码:

   WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;

它只是返回 SQL 数据。

我希望我已经提供了足够的信息来说明我到目前为止所做的事情以及我希望从给出的示例中实现什么。 简而言之,我想实现在 Justin.tv API 中编写的内容,我想利用序列化,但是当我在浏览器中浏览到返回流时,我会看到一个可以打开的文件下载在记事本中并不理想。

如果我似乎在某个时候迷路了,感谢您的任何建议,或者我可以实施的任何解决方案:)

问候, 罗纳德

【问题讨论】:

  • 您是否将 ContentType 应用于响应,例如text/xml,还是text/json
  • @MatthewAbbott 没有声明内容类型,这是理想流返回所必需的吗?
  • 我想这可能是问题所在。因为您返回的是 Stream 而不是对象,所以我认为没有指定任何内容类型,因此浏览器不知道如何处理它 - 这会提示下载消息。尝试添加 text/json 的内容类型,看看是否可以解决问题。然后我会检查请求的内容类型,并让您的服务适应它。
  • 请显示您用于调用服务的 JavaScript 代码(除非您想直接在浏览器中显示调用结果)。
  • @MatthewAbbott 谢谢你,这正是我们所需要的,谢谢你的解释。既然我正确地返回了信息,您是否有关于如何将第二个对象附加到同一响应的任何提示?

标签: c# xml wcf json


【解决方案1】:

您是否将 ContentType 应用于响应,例如text/xml,还是text/json

我想这很可能是问题所在。因为您返回的是 Stream 而不是对象,所以我认为没有指定任何内容类型,因此浏览器不知道如何处理它 - 这会提示下载消息。尝试添加 text/json 的内容类型,看看是否可以解决问题。然后我会检查请求的内容类型,并让您的服务适应它。

更新关于向流中添加第二个对象,我建议不要尝试简单地将其附加到流的末尾。相反,为什么不构建一个复合模型,其中包含两个属性,表示要序列化并从服务传回的对象?

【讨论】:

  • 谢谢你,这就是我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2014-09-25
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多