作为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不能隐式转换为字符串”。
答案 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