【问题标题】:WCF REST return single method as JSON and XMLWCF REST 以 JSON 和 XML 形式返回单一方法
【发布时间】:2013-02-10 04:34:22
【问题描述】:

我正在使用以下 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。我无法更改我的版本。

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    我遇到了同样的问题。 我们通过创建两个端点来提供解决方案,一个用于 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>
    

    希望这会有所帮助。

    【讨论】:

    • 什么是contract="xxxxxx.Ixxxxxxx" 是那个namespace.Interface?
    • contract="xxxxxx.Ixxxxxxx" 确实是对接口的引用。
    • @Satchi 这真的很有帮助。谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • automaticFormatSelectionEnabled 属性是在 .NET 4.0 中添加的; OP 指定他们需要使用 3.5
    • 是的,它适用于 4.0 及更高版本.. :S.
    • 它在我的环境中寻找“接受”而不是“内容类型”的标题
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多