WCF响应中的JSON格式

时间:2012-02-15 17:33:29

标签: wcf json

作为WCF的新手,我试图找出从WCF服务返回JSON对象的正确配置。

我得到的结果是(在萤火虫中查看):

{"TestServiceResult": "{\"AccountID\":999999,\"CardNumber\":555555,\"AccountBalance\":999.99,\"GivenName\":\"Ben\",\"FamilyName\":\"Rosniak\"}"}

我感兴趣的部分是一个长字符串,而不是我追求的JSON对象。

有关该服务的唯一配置是(该项目由其他人启动):

<!-- Added for Mobile Pay Service-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="MobilePayServiceBehaviour" >
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <!--<serviceCredentials >
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MobilePayService.WtfUserNamePasswordValidator, MobilePayService" />
          </serviceCredentials>
          <serviceAuthorization principalPermissionMode="Custom">
            <authorizationPolicies>
              <add policyType="MobilePayService.WtfAuthorizationPolicy, MobilePayService" />
            </authorizationPolicies>
          </serviceAuthorization>-->
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="WebHttpBehaviour">
          <webHttp automaticFormatSelectionEnabled="false" defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" helpEnabled="true" />
        </behavior>
      </endpointBehaviors>
    </behaviors>

我正在使用的测试方法确保响应格式化:

[WebGet(UriTemplate = "TestService/{id}/{device}/{culture}")]
public string TestService(string id, string device, string culture)
{
    WCFProfileModel profileModel = new WCFProfileModel()
        {
            AccountID = 999999,
            AccountBalance = 999.99F,
            CardNumber = 555555,
            GivenName = "Ben",
            FamilyName = "Rosniak"
        };

    return profileModel;
}

不知怎的,响应被包裹在某种模板中,我想知道这种情况发生的地点和方式,但我不知道从哪里开始寻找这个。我想剥离"TestServiceResult"部分,只返回:

{"AccountID":999999,"CardNumber":555555,"AccountBalance":999.99,"GivenName":"Ben","FamilyName":"Rosniak"}

更新 我已经尝试按照教程here(更新我的代码来反映这一点),但我得到一个错误“说profileModel不能隐式转换为字符串”。

3 个答案:

答案 0 :(得分:3)

感谢您的回复(and this link),虽然所有回复都以自己特定的方式提供,但我必须添加BodyStyle = WebMessageBodyStyle.Bare作为mehod属性(感谢@Mehmet Aras)。

返回一个字符串显然是错误的方法,并且必须将返回类型更改为WCFProfileModel

在WCFProfileModel中,我必须看起来像:

namespace MyNamspace.PhonePayService.DataModels
{
    [DataContract]
    public class WCFProfileModel
    {
        [DataMember]
        public int AccountID { get; set; }

        [DataMember]
        public int CardNumber { get; set; }

        [DataMember]
        public float AccountBalance { get; set; }

        [DataMember]
        public string GivenName { get; set; }

        [DataMember]
        public string FamilyName { get; set; }
    }
}

这个最终方法如下:

    [WebGet(UriTemplate = "TestService/{id}/{device}/{culture}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    public WCFProfileModel TestService(string id, string device, string culture)
    {
        WCFProfileModel profileModel = new WCFProfileModel()
            {
                AccountID = 999999,
                AccountBalance = 999.99F,
                CardNumber = 555555,
                GivenName = "Ben",
                FamilyName = "Rosniak"
            };

        return profileModel;
    }

我完全忽视的东西。

答案 1 :(得分:2)

尝试将配置中的defaultBodyStyle从Wrapped更改为Bare。

答案 2 :(得分:1)

我不确定我是否完全理解你的问题迈克,但我可以给你使用JSON的最佳建议是抓住James Newton King的JSON.NET包。对我来说,它已被证明无比优于基础.NET库的JSON支持和性能。它让您可以控制如何选择序列化和反序列化您的JSON,完整的LINQ支持各种好东西。如果您尚未查看它,请查看它:http://james.newtonking.com/pages/json-net.aspx