Использование JSON в методе службы WCF

В большом проекте у меня возникают проблемы с получением метода службы 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; } }

    }

Любая помощь очень ценится и если есть требуется другая информация, дайте мне знать.

Большое спасибо.

8
задан Simon Rigby 31 March 2011 в 09:46
поделиться