【问题标题】:WCF returns xml instead of JSONWCF 返回 xml 而不是 JSON
【发布时间】:2014-07-11 10:59:35
【问题描述】:

我在我的客户项目中使用来自其他项目的网络服务(尽管两个项目都在同一个解决方案中)

我期待 JSON 输出但无法获取,

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "FetchSitePerformanceDT/{fromDate}/{country}")]
    public DataTable FetchSitePerformanceDT(string fromDate, string country)
    {
        SitePerformance objSiteP = new SitePerformance();
        DataTable dt = new DataTable();
        dt = objSiteP.getPerformanceByDateAndCountryAsDataTable(fromDate, country);
        return dt;
    }

此函数返回输出,如,

{"FetchSitePerformanceDTResult":"<DataTable xmlns=\"http:\/\/schemas.datacontract.org\/2004\/07\/System.Data\"><xs:schema id=\"NewDataSet\" xmlns:xs=\"http:\/\/www.w3.org\/2001\/XMLSchema\" xmlns=\"\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\"><xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"DailyBingRTT_Performance_Last7Days_Result\" msdata:UseCurrentLocale=\"true\"><xs:complexType><xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\"><xs:element name=\"DailyBingRTT_Performance_Last7Days_Result\"><xs:complexType><xs:sequence><xs:element name=\"DailyTimeStamp\" type=\"xs:string\" minOccurs=\"0\"\/><xs:element name=\"Performance\" type=\"xs:string\" minOccurs=\"0\"\/><\/xs:sequence><\/xs:complexType><\/xs:element><\/xs:choice><\/xs:complexType><\/xs:element><\/xs:schema><diffgr:diffgram xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\"><DocumentElement xmlns=\"\"><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result1\" msdata:rowOrder=\"0\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 03, 2013<\/DailyTimeStamp><Performance>106917<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result2\" msdata:rowOrder=\"1\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 04, 2013<\/DailyTimeStamp><Performance>119542<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result3\" msdata:rowOrder=\"2\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 05, 2013<\/DailyTimeStamp><Performance>106917<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result4\" msdata:rowOrder=\"3\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 06, 2013<\/DailyTimeStamp><Performance>119542<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result5\" msdata:rowOrder=\"4\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 07, 2013<\/DailyTimeStamp><Performance>106917<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result6\" msdata:rowOrder=\"5\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 08, 2013<\/DailyTimeStamp><Performance>119542<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><DailyBingRTT_Performance_Last7Days_Result diffgr:id=\"DailyBingRTT_Performance_Last7Days_Result7\" msdata:rowOrder=\"6\" diffgr:hasChanges=\"inserted\"><DailyTimeStamp>Nov 09, 2013<\/DailyTimeStamp><Performance>106917<\/Performance><\/DailyBingRTT_Performance_Last7Days_Result><\/DocumentElement><\/diffgr:diffgram><\/DataTable>"}

那是什么? xml还是什么?我不想要,所以手动将其转换为 JSON 之类的,

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "FetchSitePerformanceStream/{fromDate}/{country}")]
        public Stream FetchSitePerformanceStream(string fromDate, string country)
        {
            SitePerformance objSiteP = new SitePerformance();

            List<DailyBingRTT_Performance_Last7Days_Result> l = new List<DailyBingRTT_Performance_Last7Days_Result>();
            l = objSiteP.getPerformanceByDateAndCountry(fromDate, country);

            var javaScriptSerializer = new JavaScriptSerializer();
            var json = Encoding.UTF8.GetBytes(javaScriptSerializer.Serialize(l));
            var memoryStream = new MemoryStream(json);
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
            return memoryStream;

        }

它给出了正确的输出,例如,

[{"DailyTimeStamp":"Nov 03, 2013","Performance":106917},{"DailyTimeStamp":"Nov 04, 2013","Performance":119542},{"DailyTimeStamp":"Nov 05, 2013","Performance":106917},{"DailyTimeStamp":"Nov 06, 2013","Performance":119542},{"DailyTimeStamp":"Nov 07, 2013","Performance":106917},{"DailyTimeStamp":"Nov 08, 2013","Performance":119542},{"DailyTimeStamp":"Nov 09, 2013","Performance":106917}]

谁能帮助我在我的第一种网络服务方法中出了什么问题。 感谢您阅读这么长的问题。

【问题讨论】:

    标签: asp.net xml json wcf


    【解决方案1】:

    不要从 Web 服务返回 DataTable。您正在使需要通过电线转移的负载不必要地加重。

    DataTable 对象不仅包含数据,还包含架构信息。不仅此信息对非 Microsoft 客户端无用,而且此架构信息还会使要传输的数据的大小膨胀。

    而是创建一个 DTO(数据传输对象),然后将它们的集合发送给客户端。

    【讨论】:

    • 谢谢朋友,如果我发送 List 对象作为回报可以吗?
    • 是的,这是首选方法。让 WCF 将该响应序列化为 JSON,然后让客户端根据需要进行解析。
    【解决方案2】:

    您的问题中缺少的主要内容是 DailyBingRTT_Performance_Last7Days_Result

    是自定义构建类还是数据表?结构是什么?

    解决办法如下:

    Class Performance { 
      publc datetime DailyTimeStamp { get; set;}
      public int performance ... 
    }
    
    List<Performance> ... 
    
    return serializer.Serialize(rows);
    

    【讨论】:

    • 你是说函数应该是 list 类型吗?
    • 我在我的回答中假设您正在寻找输出为: [{"DailyTimeStamp":"Nov 03, 2013","Performance":106917} 因此您需要提供自定义类你正在寻找的。否则序列化器永远不会知道什么是 serliaze 格式
    • 我正在尝试使用已经由 .net 构建的代码,因为我们可以看到 webInvoke 中有一个属性为“responseformat=JSON”。如果属性正确,为什么输出不是 JSON?
    • 如果您想进一步了解我所说的内容,请转到此处::stackoverflow.com/questions/17398019/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多