2012-06-18 6 views
6

मैं उपभोग करने के लिए jQuery के लिए एक सही ढंग से लपेटा JSONP मान आउटपुट करने का प्रयास कर रहा हूं।उचित प्रारूप में JSONP लौटें WCF

उत्पादन मैं तलाश कर रहा हूँ है:

jsoncallback({"Status": "OK"}) 

लेकिन एटीएम यह outputting है:

"jsoncallback({"Status": "OK"})" 

जाहिर है इस jQuery अनुरोध को पूरा नहीं कर सकते हैं के रूप में सही JSONP स्वरूप में नहीं है प्रतिक्रिया।

सी # में मेरे OperationContract है:

[OperationContract] 
[WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "returndata?s={s}")] 
Stream EchoWithGet(string s); 

    public string EchoWithGet(string s) 
    { 
     string json = @"jsoncallback({'Status':'OK'})"; 
     Console.WriteLine("Call Made: " + s); 
     return json; 
    } 

मैं JavaScriptSerializer उपयोग करने के लिए JSON.NET और भी System.Web.Script नाम स्थान का उपयोग कर की कोशिश की है।

लेकिन मेरे लिए कुछ भी काम नहीं कर रहा है, जो मैं वास्तव में करना चाहता हूं वह दो डबल कोट्स से छुटकारा पाता है।

+0

क्या WPF इस के साथ करना होगा है? –

+0

मैं डब्ल्यूपीएफ पर्यावरण का उपयोग कर रहा हूं, इसलिए मैं इसे पूरा करना चाहता हूं।आम तौर पर मैं एएसपी से संबंधित उत्तर प्राप्त करना समाप्त कर दूंगा जहां यह –

उत्तर

11

आप jQuery के साथ एक ajax अनुरोध प्रस्तुत करने और dataType: "jsonp" के लिए पूछता है कर रहे हैं, jQuery अनुरोध में कॉलबैक फ़ंक्शन के लिए एक नाम पारित करेंगे (जैसे, /returndata?s=hello&callback=jquery123456789), इसलिए लौटने एक निरंतर "jsonCallback" उस मामले में काम नहीं करेगा ।

इसके अलावा, आपके प्रश्न में आपके पास ऑपरेशन अनुबंध परिभाषा Stream लौट रही है, जबकि ऑपरेशन पर आप string लौट रहे हैं - कुछ गलत है।

आपको क्या करना है: आपके पास दो विकल्प हैं। पहला यह है कि डब्ल्यूसीएफ आपके लिए जेएसओएनपी पैडिंग को संभालने दें। आपके ऑपरेशन को "स्थिति" संपत्ति के साथ डेटा प्रकार वापस करने की आवश्यकता होगी, और बस इसे वापस कर दें। आपको अपने एंडपॉइंट द्वारा उपयोग किए गए WebHttp बाइंडिंग पर CrossDomainScriptAccessEnabled प्रॉपर्टी को भी सक्षम करने की आवश्यकता होगी। आपका आपरेशन नीचे कोड कुछ ऐसा दिखाई देगा:

public class MyType 
{ 
    public string Status { get; set; } 
} 

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "returndata?s={s}")] 
    public MyType ReturnData(string s) 
    { 
     return new MyType { Status = "OK" }; 
    } 
} 

दूसरा विकल्प, आप अपने आप को JSONP कोड बनाना चाहते हैं, कॉलबैक फ़ंक्शन नाम का यूआरआई में एक अतिरिक्त पैरामीटर लेने के लिए हो सकता है, तो इसका इस्तेमाल आपकी प्रतिक्रिया बनाते समय। आपको इसे Stream के रूप में वापस करने की भी आवश्यकता होगी, ताकि आपको स्ट्रिंग के रूप में प्रतिक्रिया न मिल सके (जो शायद आपके पास अभी है)। यही कारण है कि इस प्रकार दिखाई देगा:

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "ReturnData?s={s}&callback={callbackFunctionName}")] 
    public Stream EchoWithGet(string s, string callbackFunctionName) 
    { 
     string jsCode = callbackFunctionName + "({\"Status\":\"OK\"});"; 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/javascript"; 
     return new MemoryStream(Encoding.UTF8.GetBytes(jsCode)); 
    } 
} 

और यह jQuery कोड इस सेवा का उपयोग करने के लिए इस्तेमाल किया जा सकता:

function StackOverflow_11090835_Test() { 
     var url = "/StackOverflow_11090835.svc/ReturnData"; 
     var data = { s: "Hello world" }; 
     $.ajax({ 
      type: 'GET', 
      url: url, 
      data: data, 
      dataType: "jsonp", 
      success: function (result) { 
       $("#result").text(result.Status); 
      } 
     }); 
    } 
+0

द्वारा भी देखा जा रहा है इसके लिए धन्यवाद, यह समस्या हो सकती है, और स्ट्रीम डेटाटाइप त्रुटि के बारे में खेद है, वास्तव में यह एक गलती थी क्योंकि मैं कोड के साथ खेल रहा था। मैं इसे आज रात कोशिश करूँगा और देखें कि क्या होता है। धन्यवाद फिर से –

+0

महान काम करता है! धन्यवाद, 10 घंटों के शोध के बाद मैंने अंत में इसे प्रबंधित किया है। –

+0

मुझे पहले विकल्प को समझ में नहीं आया। डब्ल्यूसीएफ आपके लिए जेएसओएनपी पैडिंग कैसे संभालता है? और बाध्यकारी को 'CrossDomainScriptAccessEnabled' की आवश्यकता क्यों है लेकिन विकल्प 2 नहीं है? – xr280xr

1

आपको अपने डब्ल्यूसीएफ कॉल से आउटपुट को बेचना होगा। यह fiddle देखें।

आप अपने डब्ल्यूसीएफ कॉल से एक स्ट्रिंग वापस प्राप्त कर रहे हैं। आपको अनिवार्य रूप से इसे संकलित करने और फिर इसे निष्पादित करने की आवश्यकता है।

function jsonCallback(obj){ 
    alert(obj.Status); 
} 

$(document).ready(function(){ 
    var js = "jsonCallback({'Status':'OK'})"; 
    eval(js); 
});​ 

js चर WCF कॉल द्वारा अपना उत्पादन होता है:

यहाँ बेला से कोड है। जैसे ही मैं इसे संकलित और निष्पादित कर दूंगा।

+0

संकेतों के लिए नमस्ते धन्यवाद नहीं है, लेकिन मुझे विश्वास नहीं है कि मेरे प्रश्न का उत्तर "jsoncallback ({" स्थिति ":" ठीक "} के रूप में है) 'jQuery –