从返回的JSON中排除DataContract Name

本文关键字:排除 DataContract Name JSON 返回 | 更新日期: 2023-09-27 18:18:23

我的WCF服务中有以下数据合约

namespace MyNamespace
{
    [DataContract(Namespace = Constants.ContractNamespace)]
    public class MyResponse
    {
        [DataMember]
        public string ResponseCode { get; set; }
        [DataMember]
        public List<MyObject> MyObjects  { get; set; }
    }
}

当我使用它作为operationcontract的返回类型时,就像这样

[OperationContract]
MyResponse ValidateById(string id);

然后得到以下响应

{"MyResponse":{"MyObjects":null,"ResponseCode":"ERR001"}}

有没有办法让它返回属性就像

{"MyObjects":null,"ResponseCode":"ERR001"}

更新:我还使用了transportClientEndpointBehavior

<endpointBehaviors>
    <behavior name="EndpointBehavior_IMyService">
      <transportClientEndpointBehavior>
        <tokenProvider>
          <sharedAccessSignature keyName="RootManageSharedAccessKey" key="keyhere" />
        </tokenProvider>
      </transportClientEndpointBehavior>
    </behavior>
  </endpointBehaviors>

和一个netttcprelaybinding

<netTcpRelayBinding>
    <binding name="NetTcpRelayBinding_IMyService"/>
  </netTcpRelayBinding>

从返回的JSON中排除DataContract Name

你可以在配置文件中使用Body Style属性来设置是否包装响应。例如

<endpointBehaviors>
    <behavior name="WebWithDefaults">
        <webHttp defaultOutgoingResponseFormat="Json"
                 defaultBodyStyle="Bare" />
    </behavior>
</endpointBehaviors>

以上代码采用webHttp协议。你可以把它改成你自己的

原来问题出在我的数据合同上。

上面我放错了,实际上是

   [DataContract(Name = "MyResponse", Namespace = Common.Constants.ContractNamespace)]
public class MyValidateModel
{
    [DataMember]
    public MyResponse MyResponse { get; set; }
}

但必须是

   [DataContract(Name = "MyResponse", Namespace = Common.Constants.ContractNamespace)]
public class MyValidateModel : Common.MyResponse
{
}