В большом проекте у меня возникают проблемы с получением метода службы WCF для использования параметра JSON. Итак, я создал небольшой тестовый пример, и его поведение повторилось. Если я отлаживаю службу, я вижу, что значение параметра равно нулю при вызове службы. 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 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 GetPlayers()
{
return new List()
{
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 ...
{"Имя": "Саймон", "Оценка": "100", "Клуб": "Ригби"}
, но в службе параметр имеет значение NULL, и никаких исключений для форматирования нет.
Это ветвь system.serviceModel службы web.config:
А вот и Контракт данных игрока.
[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; } }
}
Любая помощь очень ценится и если есть требуется другая информация, дайте мне знать.
Большое спасибо.