2012-02-15 51 views
0

作为WCF新手,我试图找出从WCF服务返回JSON对象的正确配置。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"}

UPDATE: 我试图教程here(更新我的代码,以反映这一点)以下的,但我得到一个错误“的说法profileModel不能隐式转换为字符串“。

回答

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

东西我完全忽略。

+0

M $应该默认它为Bare,但事实并非如此。如果没有设置,JSON响应会停止工作。 – Devela 2012-10-12 07:13:46

1

我不知道我完全理解你的问题迈克,但我可以给你与JSON合作的最佳建议是抓住詹姆斯牛顿金的JSON.NET包。对我来说,它已被证明无论如何优于基础.NET库的JSON支持和性能。它让你对如何选择序列化和反序列化JSON有很大的控制权,完整的LINQ支持所有类型的好东西。给它看看,如果你还没有检查出来:http://james.newtonking.com/pages/json-net.aspx

+0

谢谢。我会研究这一点。 – 2012-02-15 20:58:34

2

尝试更改配置中的defaultBodyStyle从Wrapped到裸。

+0

谢谢,我这样做了,但我想我离开了我的更新,我会解决这个问题。 – 2012-02-15 20:43:00

+0

我刚才注意到了。该方法返回一个字符串,但你返回一个WCFProfileModel。除非您重写ToString方法,否则不能这样做。为什么不只是指定WCFProfileModel作为返回类型? – 2012-02-15 20:48:30

+0

你是对的。我正在尝试一些东西,没有正确复制。还有其他问题(见下文)。 – 2012-02-15 20:58:17