Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF返回流或字符串?_C#_Xml_Wcf_Json - Fatal编程技术网

C# WCF返回流或字符串?

C# WCF返回流或字符串?,c#,xml,wcf,json,C#,Xml,Wcf,Json,我一直对WCF和返回类型越来越失望。 目前我正在研究一种方法,该方法从SQL中读取数据,根据检索到的数据量创建特定类型的新对象,然后用从SQL中检索到的数据分配对象值 我已经准备好了序列化为JSON和XML的功能。 理想情况下,我希望将序列化对象转换为字符串,以便能够以转换后的方式从浏览器读取响应,希望下面的示例更具说明性 当我序列化对象并返回流时,我从中得到的好处是,格式是完美的,并且它在类中使用我的DataMembers,因此JSON中的响应如下所示: {"GameID":1,"Propos

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

我已经准备好了序列化为JSON和XML的功能。 理想情况下,我希望将序列化对象转换为字符串,以便能够以转换后的方式从浏览器读取响应,希望下面的示例更具说明性

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

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

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

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

虽然我不确定我是否可以粘贴我想要实现的某个内容的url,但它仍然是:

我的直接想法是使用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中编写的内容,我希望利用序列化,但是当我在浏览器中浏览返回流时,我会收到一个文件下载,我可以在记事本中打开它,这并不理想

如果我在某个时候迷路了,感谢你给我的建议,或者我可以执行的任何决议:)

问候,,
Ronald

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


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


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

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