在一个较大的项目中,我很难获得WCF服务方法来使用JSON参数。因此,我制作了一个较小的测试用例,并产生了相应的行为。如果我调试服务,则可以在服务调用中看到参数值为null。Fiddler确认正在发送JSON,JsonLint确认它有效。
下面的代码带有调试注释。
[ServiceContract]
public interface IWCFService
{
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "getstring")]
string GetString();
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "getplayer")]
//[WebGet(BodyStyle = WebMessageBodyStyle.WrappedRequest,
// ResponseFormat = WebMessageFormat.Json,
// UriTemplate = "getplayers")]
Player GetPlayer();
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "getplayers")]
List<Player> GetPlayers();
[OperationContract]
[WebInvoke(
Method = "POST",
BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
UriTemplate = "totalscore")]
string TotalScore(Player player);
}
…及其实施
public class WCFService : IWCFService
{
public string GetString()
{
return "hello from GetString";
}
public Player GetPlayer()
{
return new Player()
{
Name = "Simon",
Score = 1000,
Club = new Club()
{
Name = "Tigers",
Town = "Glenelg"
}
};
}
public List<Player> GetPlayers()
{
return new List<Player>()
{
new Player()
{
Name = "Simon",
Score = 1000 ,
Club=new Club()
{
Name="Tigers",
Town = "Glenelg"
}
},
new Player()
{
Name = "Fred", Score = 50,
Club=new Club()
{
Name="Blues",
Town="Sturt"
}
}
};
}
public string TotalScore(Player player)
{
return player.Score.ToString();
}
}
调用前三个方法中的任何一个都可以正常工作(但没有参数,您会注意到)。使用此客户端代码调用最后一个方法(TotalScore)…
function SendPlayerForTotal() {
var json = '{ "player":{"Name":"' + $("#Name").val() + '"'
+ ',"Score":"' + $("#Score").val() + '"'
+ ',"Club":"' + $("#Club").val() + '"}}';
$.ajax(
{
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://localhost/wcfservice/wcfservice.svc/json/TotalScore",
data: json,
dataType: "json",
success: function (data) { alert(data); },
error: function () { alert("Not Done"); }
});
}
… 结果是 …
尝试反序列化参数http://tempuri.org/:player时发生错误。InnerException消息为“预期状态为’元素’..遇到名称为”,名称空间为”的’文本’。’。
我尝试发送JSON的未包装版本…
{“名称”:“ Simon”,“得分”:“ 100”,“俱乐部”:“里格比”}
但在服务中,该参数为null,并且没有格式程序异常。
这是服务web.config的system.serviceModel分支:
<system.serviceModel>
<services>
<service name="WCFService.WCFService" behaviorConfiguration="WCFService.DefaultBehavior">
<endpoint address="json" binding="webHttpBinding" contract="WCFService.IWCFService" behaviorConfiguration="jsonBehavior"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFService.DefaultBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
这是Player DataContract。
[DataContract(Name = "Player")]
public class Player
{
private string _name;
private int _score;
private Club _club;
[DataMember]
public string Name { get { return _name; } set { _name = value; } }
[DataMember]
public int Score { get { return _score; } set { _score = value; } }
[DataMember]
public Club Club { get { return _club; } set { _club = value; } }
}
非常感谢任何帮助,如果需要任何其他信息,请告诉我。
非常感谢。
您以错误的方式player
对方法的输入参数进行编码TotalScore
。
我建议您使用json2.js中的JSON.stringify
函数将任何JavaScript对象转换为JSON。
var myPlayer = {
Name: "Simon",
Score: 1000,
Club: {
Name: "Tigers",
Town: "Glenelg"
}
};
$.ajax({
type: "POST",
url: "/wcfservice/wcfservice.svc/json/TotalScore",
data: JSON.stringify({player:myPlayer}), // for BodyStyle equal to
// WebMessageBodyStyle.Wrapped or
// WebMessageBodyStyle.WrappedRequest
// data: JSON.stringify(myPlayer), // for no BodyStyle attribute
// or WebMessageBodyStyle.WrappedResponse
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data, textStatus, xhr) {
alert(data.TotalScoreResult); // for BodyStyle = WebMessageBodyStyle.Wrapped
// or WebMessageBodyStyle.WrappedResponse
// alert(data); // for BodyStyle = WebMessageBodyStyle.WrappedRequest
// or for no BodyStyle attributes
},
error: function (xhr, textStatus, ex) {
alert("Not Done");
}
});
如果BodyStyle = WebMessageBodyStyle.Wrapped
将TotalScore
方法的属性BodyStyle = WebMessageBodyStyle.WrappedRequest
更改为alert(data.TotalScoreResult)
,则可以将success
句柄中的更改为alert(data)
。
我可以在我自己的电脑上使用这个程序,但是我不能在服务器上使用。 服务器使用最高权限管理员打开程序。 具有的服务器WCF HTTP激活功能。NET4。5号门开着。 服务器endpoint地址使用"http://localhost",如下所示 endpoint地址="http://localhost"绑定="basicHttpBind"bindingConfiguration="NewBinding0
问题内容: 我们有一个配置了SSL的网站,可托管WCF服务。服务的绑定具有,并且通信使用JSON序列化。 当我们从http请求此服务时,它返回JSONP,但是当使用HTTPS请求该服务时,它仅返回JSON。无论哪种方式我都需要JSONP,请帮忙。 当前配置是这样的: 问题答案: 如果使用此配置会发生什么: 问题是,如果要同时通过HTTP和HTTPS调用服务,则必须提供两个端点-一个端点用于HTTP
问题内容: 我有一个相对简单的问题,我似乎找不到答案。 当WCF执行对象的序列化时,它会自动应用类型提示。对于Json服务,这会在每个称为的复杂对象上产生一个额外的字段。对象定义为: 将序列化为: 通常这不是问题。不幸的是,当您开始将类嵌套到相当大和复杂的结构中时,这将导致大量返回给客户端的JSON响应的开销。 当然,必须有一种方法来禁用此行为,但是我一直找不到(Rick Strahl早在2007
问题内容: 我创建了一个wcf服务。当我通过添加为Web服务在.net中简单使用时,效果很好。但我想使其能够用于iPhone应用程序作为JSON调用。为了进行测试,我在.net中使用JSON进行了测试,但无法正常工作。 我知道以前问过这样的问题,我一直在寻找无法为我找到解决方案。 我的配置: 接口代码: Myservice.cs代码: 我想使用以下网址格式调用该方法:http : //exampl
我有一个WCF服务,我试图在Sitecore 7.1应用程序中托管。具有相同配置的Web服务在空白Asp.net应用程序中托管时运行良好。但是当尝试从Sitecore应用程序运行它时,它不起作用(下面的错误)。我也尝试了这些解决方案,但没有运气。我不确定它们是否应该适用于最新版本的Sitecore。 https://adeneys.wordpress.com/2008/10/17/make-sit
我一直在遵循这个例子 使用jQuery创建和使用WCF Restful服务 我收到以下错误: XMLHttp请求无法加载http://localhost:48839/EmployeeService.svc/GetEmployeeDetails/.对预检请求的响应未通过权限改造检查:请求的资源上不存在“访问控制允许起源”标头。因此不允许访问起源“http://localhost:57402”。响应具