我有一些几乎相同的WCF服务代码,除了一个方法应该返回一个xml结果,另一个方法返回一个json结果:
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "xml/{id}")]
string XMLData(string id);
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json/{id}")]
string JSONData(string id);
}
xml工作正常(例如,当我在浏览器中输入“ http:// localhost:4841 / RestServiceImpl.svc / xml / 2468 ”时)。
但是,当我输入“ http:// localhost:4841 / RestServiceImpl.svc / json / 2468 ”时,我会收到“文件下载 - 安全警告”对话框,它允许我保存一个文件(本例中名为“2468”),在记事本中打开时包含以下内容:
{“JSONDataResult”:“您请求了产品2468”}
这是“按设计”(将json结果保存到文件中),还是为什么它的行为与xml-o-rama不同?
答案 0 :(得分:5)
由您的浏览器决定如何处理任何特定的Content-Type,听起来您的浏览器不知道如何使用JSON。
要检查这一点,请在使用Chrome开发者控制台或Firebug(或您使用的任何浏览器中的任何等效内容)时,查看加载该资源时的网络请求。在标题中,您应该看到类似
的内容Content-type: application/json
如果您这样做,问题是您的浏览器。如果您没有看到,那么您的服务器或服务代码是错误的(特别是如果application/octet-stream
是mime类型的等同于“我不知道”)。
就浏览器而言,我个人推荐使用Chrome +这个优秀的插件来显示格式化的JSON输出:https://github.com/callumlocke/json-formatter
答案 1 :(得分:1)
这取决于您使用哪个浏览器与服务进行通信。 IE(直到IE9)知道如何显示XML,但不知道JSON,这就是为什么它显示一个但是要求你保存另一个(就像当你浏览到一些二进制文件时)。 Chrome知道如何显示两者,因此您可以浏览到... / json / 2468和... / xml / 2468,它将显示响应。服务中没有任何关于 1 的内容。
1 实际上,如果您感兴趣的是在浏览器中显示输出(而不是某些需要了解JSON或XML的客户端使用该服务),您还可以返回数据格式化为HTML。一种简单的方法是将HTML作为流返回,如下所示。
public class StackOverflow_12940785
{
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebGet(
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "xml/{id}")]
string XMLData(string id);
[OperationContract]
[WebGet(
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json/{id}")]
string JSONData(string id);
[OperationContract]
[WebGet(
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "html/{id}")]
Stream HTMLData(string id);
}
public class Service : IRestServiceImpl
{
public string XMLData(string id)
{
return "You requested product " + id;
}
public string JSONData(string id)
{
return "You requested product " + id;
}
public Stream HTMLData(string id)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
string response = @"<html>
<head><title>My service</title></head>
<body>
<p>You requested <b>product " + id + @"</b></p>
</body>
</html>";
return new MemoryStream(Encoding.UTF8.GetBytes(response));
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
host.Open();
Console.WriteLine("Host opened");
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}