代码之家  ›  专栏  ›  技术社区  ›  santosh singh

从WCF返回多个响应

  •  7
  • santosh singh  · 技术社区  · 14 年前

    我有一个WCF服务和一个名为GetStudentList()的方法服务。It当它回到单身时,一切正常回应什么这样地

      [WebGet(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    List<Student> GetStudentList();
    

    但是我想返回多个响应,即xml和json两个都有什么这样地

      [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    [WebGet(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    List<Student> GetStudentList();
    

    3 回复  |  直到 14 年前
        1
  •  19
  •   Ladislav Mrnka    14 年前

    在.NET 4.0中是可能的,但不是按您指定的方式。NET 4.0向WebHttp行为添加新参数:

      <endpointBehaviors>
        <behavior name="WebHttp">
          <webHttp automaticFormatSelectionEnabled="true" />
        </behavior>
      </endpointBehaviors>
    

    • 接受来自请求的标头
    • webHttp行为中指定的默认格式

    因此,如果您使用JSON请求调用REST服务,您将得到JSON。如果用POX请求调用它,您将得到XML。有关自动格式选择的完整说明,请参阅 MSDN .

        2
  •  3
  •   KeithS    14 年前

    仔细想想为什么要同时使用这两种响应类型;它们都是对象序列化的信息性通用标准,使用WCF时,只有直接使用序列化的响应文本时才需要这两种类型。如果可能的话,我会重构客户机以使用相同的响应类型。

    还可以始终返回一种响应类型,并在需要以另一种格式序列化对象时,通过反序列化/重新序列化在客户端进行转换。这确实需要您在调用的客户端使用您可以控制的.NET代码。

        3
  •  1
  •   Josh    14 年前

    List<Student> studentList = GetStudent();
    string jsonString = JsonSerialize(studentList.GetType(), studentList);
    

    然后将此函数添加到实用程序类:

    public static string JsonSerialize(Type type, object objectGraph)
            {
                MemoryStream memoryStream = new MemoryStream();
    
                try
                {
                    System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(type);
                    serializer.WriteObject(memoryStream, objectGraph);
                    return Encoding.Default.GetString(memoryStream.ToArray());
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (memoryStream != null) memoryStream.Close();
                }
            }