2011-03-31 15 views
8

एक बड़ी परियोजना में मुझे एक JSON पैरामीटर का उपभोग करने के लिए डब्ल्यूसीएफ सेवा विधि प्राप्त करने में परेशानी हो रही है। इसलिए मैंने एक छोटा टेस्ट केस बनाया और व्यवहार प्रतिबिंबित हुआ। अगर मैं सेवा डीबग करता हूं तो मैं देख सकता हूं कि सेवा कॉल पर पैरामीटर मान शून्य है। फिडलर पुष्टि करता है कि जेएसओएन भेजा जा रहा है और जेसनलिंट पुष्टि करता है कि यह मान्य है।डब्ल्यूसीएफ सेवा विधि में जेएसओएन उपभोग

डीबगिंग से एनोटेशन के साथ नीचे कोड।

[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 deserialize की कोशिश करते हुए किया गया था। इनरएक्सप्शन संदेश 'राज्य की अपेक्षा' तत्व 'था' .. नाम '' नाम '' नाम '' नाम से 'टेक्स्ट' को जन्म दिया। '।

मैं JSON का एक unwrapped संस्करण भेजने की कोशिश की है ...

{ "नाम": "साइमन", "स्कोर": "100", "क्लब": "रिग्बी"}

लेकिन सेवा पर पैरामीटर शून्य है, और कोई फॉर्मेट अपवाद नहीं है।

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

और यहाँ प्लेयर DataContract है:

यह सेवा web.config की system.serviceModel शाखा है।

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

    } 

किसी भी मदद की बहुत सराहना की और यदि कोई अन्य जानकारी आवश्यक है, तो कृपया मुझे बताएं।

बहुत धन्यवाद।

उत्तर

10

आप गलत तरीके से विधि TotalScore के इनपुट पैरामीटर player को एन्कोड करते हैं।

मैं आपको किसी भी जावास्क्रिप्ट ऑब्जेक्ट्स JSON में कनवर्ट करने के लिए json2.js से JSON.stringify फ़ंक्शन का उपयोग करने की सलाह देता हूं।

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.WrappedRequest करने के लिए TotalScore विधि के BodyStyle = WebMessageBodyStyle.Wrapped विशेषता बदलते हैं तो आपको alert(data) करने के लिए success हैंडल में alert(data.TotalScoreResult) बदल सकते हैं।

+1

आपको बहुत बहुत धन्यवाद .. वह मुद्दा था। फिडलर में जेएसओएन को देखते हुए, मुझे लगता है कि int मान उद्धृत नहीं किया गया है। मैं इस धारणा के तहत था कि वे होना चाहिए। बहुत धन्यवाद। –

+0

@ सिमन रिग्बी: हाँ यह त्रुटियों में से एक था। 'क्लब' संपत्ति जिसे आपने "फॉर्म" शैली में भी क्रमबद्ध किया है, जो भी गलत हैं। मैंने 'बॉडी स्टाइल' विशेषता का अर्थ दिखाने के लिए अतिरिक्त रूप से अपना उत्तर संशोधित किया। मुझे उम्मीद है कि यह आपकी मदद भी करेगा। – Oleg

+0

बहुत धन्यवाद। स्ट्रिंग को तिथियों के साथ कैसे जाना जाता है। मेरी डब्ल्यूसीएफ सेवा उन पर ट्राइपिंग कर रही है क्योंकि इसमें इसके आसपास/दिनांक() रैपर नहीं है। क्या ऐसा कुछ है जिसे मुझे अलग से संबोधित करने की आवश्यकता होगी। मुझे यकीन नहीं है कि मैं उस कॉल में कैसे हुकूंगा क्योंकि ऑब्जेक्ट json'd एक कॉल में था। मुझे उम्मीद है कि सेन बनाता है। –

0

आपने वेब चालान पर विधि पैरामीटर को निर्दिष्ट नहीं किया है। देखें: http://msdn.microsoft.com/en-us/library/bb472541(v=vs.90).aspx

+1

धन्यवाद लेकिन यह टोटलस्कोर पर है जो प्रश्न में विधि है। –

संबंधित मुद्दे