如何防止JSON Web服务响应下载到文件?

时间:2012-10-17 18:21:32

标签: xml json wcf web-services rest

我有一些几乎相同的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不同?

2 个答案:

答案 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();
    }
}