9

我正在使用以下 WCF 休息服务代码来获取 JSON 格式

[OperationContract]   

[WebGet(UriTemplate = "/GetOrderList?request={request}", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
IEnumerable<Order> GetOrderList(Request request);

我希望这个方法也返回 XML 类型。我需要另一种方法吗?我想在不复制 XML 代码的情况下以相同的方法进行操作。我正在使用 WCF 3.5。我无法更改我的版本。

4

3 回答 3

20

我遇到了同样的问题。我们通过创建两个端点来提供解决方案,一个用于 XML,另一个用于 JSON。

确保从服务接口中删除所有属性。不要指定 RequestFormat 或 ResponseFormat 来控制 XML 或 JSON。让它由端点控制。

服务 Web.Config 更改。

<endpoint address="XML" binding="webHttpBinding" bindingConfiguration="webHttpBindingXML" contract="xxxxxx.Ixxxxxxx" behaviorConfiguration="RestXMLEndpointBehavior"/>
<endpoint address="JSON" binding="webHttpBinding" bindingConfiguration="webHttpBindingJSON" contract="xxxxxxxx.Ixxxxxxxxx" behaviorConfiguration="RestJSONEndpointBehavior"/>
  <endpointBehaviors>

    <behavior name="RestJSONEndpointBehavior">
      <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"/>
    </behavior>
    <behavior name="RestXMLEndpointBehavior">
      <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Xml"/>
    </behavior>

  </endpointBehaviors>        
<webHttpBinding>
<binding name="webHttpBindingXML"/>
<binding name="webHttpBindingJSON"/>
</webHttpBinding>

希望这可以帮助。

于 2013-12-23T19:22:14.207 回答
7

您甚至不需要在这里指定返回类型,我们在端点行为中为 WebGet提供了一个名为automaticFormatSelectionEnabled的属性,如下所示。当您从客户端发出休息呼叫请求时,您可以将类型指定为 WebClient.Headers["Content-type"] = "application/json"; WebClient.Headers["Content-type"] = "application/xml"; ,服务将检测类型并返回您想要的正确格式..

  <endpointBehaviors>
        <behavior name="RestServiceEndPointBehavior">
          <webHttp automaticFormatSelectionEnabled="true"   />
        </behavior>
  </endpointBehaviors>
于 2013-02-25T05:24:59.117 回答
3

如果您使用的是 .NET 4.0 或 4.5,那么它会很简单 - 使用 Vibin Kesavan 建议的自动格式选择,或者WebOperationContext.Current.OutgoingResponse.Format根据您的某些逻辑在操作中将其设置为 JSON 或 XML。

对于 3.5,您需要完成大部分工作。这篇文章有一个正是这种情况的实现。您需要创建一个自定义调度消息格式化程序实现,它(可能)包装两种格式化程序,一种用于 JSON,另一种用于 XML。并且在序列化响应时,根据您的逻辑决定使用哪个格式化程序。

于 2013-02-25T06:23:19.250 回答