繁体   English   中英

从WCF返回多个响应

[英]Return multiple response from WCF

我在服务中有一个WCF服务和一个名为GetStudentList()的方法。当它返回单个响应时工作正常。这样的事情

  [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();

有可能吗?如果是,那怎么样?

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

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

使用自动格式选择时,响应的格式基于:

  • 从请求中接受标头
  • 请求的内容类型
  • 操作时指定的默认格式
  • webHttp行为中指定的默认格式

因此,如果您使用JSON请求调用REST服务,您将获得JSON。 如果您使用POX请求调用它,您将获得XML。 自动格式选择的完整描述在MSDN中

我不认为可以使用一个调用将对象作为Json和XML返回。 在这方面,可以将WCF视为正常的方法调用; 你调用一个方法,你得到一个序列化的返回值。 一旦服务向呼叫者返回了一个响应,呼叫就完成了。

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

如果真的需要两种类型,最简单的解决方法是提供此方法的两个“重载”,并使每个客户端类型足够智能以知道它需要进行哪个调用。 因为差异不在方法签名中,所以它不是真正的重载; 您必须通过名称(GetStudentListJSON与GetStudentListXML)或通过在不同的服务类中查找方法来分隔它们。

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

我不知道如何从服务操作中获得2个输出。 您始终可以获取XML(序列化DataContract),然后“JSON Serialize”。 这是你如何做到的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM