2012-01-16 14 views
5

मेरे समस्या मुद्दा जाना जाता है और here और here चर्चा की है। लेकिन सुझाए गए समाधानों को पढ़ने और कार्यान्वित करने के बाद भी मैं यह काम करने में असमर्थ हूं।क्रॉस डोमेन कॉल

समस्या: एक्सएमएल लौटने वेब सेवा json के insted:

दूरस्थ सर्वर (IIS 7.0, .नेट 4):

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">"Now i am getting jsop string""2nd param"</string> 

अब वर्गों में कोड को तोड़ने की सुविधा देता है:
web.config:

<?xml version="1.0"?> 
<configuration> 
     <system.webServer> 
      <modules> 
       <add name="JsonHttpModule.JsonHttpModule" type="JsonHttpModule"/> 
      </modules> 
     </system.webServer> 
    <system.web.extensions> 
     <scripting> 
      <webServices> 
       <jsonSerialization maxJsonLength="102400"/> 
      </webServices> 
     </scripting> 
    </system.web.extensions> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
     <customErrors mode="Off"/> 
     <webServices> 
      <protocols> 
       <add name="HttpGet"/> 
       <add name="HttpPost"/> 
      </protocols> 
     </webServices> 
    </system.web> 
</configuration> 


वेब सेवा:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Script.Services; 
using JsonHttpModule; 
/// <summary> 
/// Summary description for JSONP_EndPoint 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class MyService : System.Web.Services.WebService { 
    [WebMethod] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public string Sum(string x, string y) 
    { 
     return x + y; 
    } 

} 


HttpModule वर्ग:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.IO; 
using System.Text; 

/// <summary> 
/// Summary description for ContentTypeHttpModule 
/// </summary> 
namespace JsonHttpModule 
{ 
    public class JsonHttpModule : IHttpModule 
    { 
     private const string JSON_CONTENT_TYPE = "application/json; charset=utf-8"; 

     public void Dispose() 
     { 
     } 
     public void Init(HttpApplication app) 
     { 
      app.BeginRequest += OnBeginRequest; 
      app.EndRequest += new EventHandler(OnEndRequest); 
     } 
     public void OnBeginRequest(object sender, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)sender; 
      HttpRequest request = app.Request; 
      //Make sure we only apply to our Web Service 
      if (request.Url.AbsolutePath.ToLower().Contains("MyService.asmx")) 
      { 
       if (string.IsNullOrEmpty(app.Context.Request.ContentType)) 
       { 
        app.Context.Request.ContentType = JSON_CONTENT_TYPE; 
       } 
       app.Context.Response.Write(app.Context.Request.Params["callback"] + "("); 
      } 
     } 
     void OnEndRequest(object sender, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)sender; 
      HttpRequest request = app.Request; 
      if (request.Url.AbsolutePath.ToLower().Contains("MyService.asmx")) 
      { 
       app.Context.Response.Write(")"); 
      } 
     } 
    } 
} 

ग्राहक के पक्ष (स्थानीय होस्ट):

<script> 
    $(function() { 
     $('#btn_test').click(function() { 
      $.ajax({ url: "http://tonofweb.com/MyService.asmx/Sum", 
       data: { x: JSON.stringify("Now i am getting jsop string"), y: JSON.stringify("2nd param") }, 
       dataType: "jsonp", 
       success: function (json) { 
        alert(json.d); 
       }, 
       error: function() { 
        alert("Hit error fn!"); 
       } 
      }); 
    }); 
}); 
</script> 
    <input id="btn_test" type="button" value="POST" /> 

तो मैं यहां क्या गलत कर रहा हूं? आप इसे स्वयं परीक्षण कर सकते हैं यह एक लाइव वेब सेवा है। आपकी मदद के लिए धन्यवाद।

+0

jsonp से बदल रहा है क्रॉस डोमेन मुद्दा की वजह से काम नहीं कर रहा है और अभी भी अभी भी आपत्ति लौट एक्सएमएल –

उत्तर

7

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

$.ajax({ 
    url: "http://tonofweb.com/MyService.asmx/Sum", 
    contentType: "application/json; charset=utf-8", 
    data: { x: JSON.stringify("1"), y: JSON.stringify("2") }, 
    dataType: "jsonp", 
    success: function (json) { 
    alert(json.d); 
    }, 
    error: function() { 
    alert("Hit error fn!"); 
    } 
}); 

सूचना मैं अनुरोध सेटिंग के contentType: "application/json; charset=utf-8", गयी।

मैं कोड http://tonofweb.com के लिए ब्राउज़ (जो इस समय एक 403 देता है), jQuerify bookmarklet का उपयोग कर jQuery सहित, और उसके बाद अपने प्रश्न से कोड चल पहले ( बिना contentType) द्वारा इस कोड का परीक्षण किया है, और फिर मैंने उपरोक्त पोस्ट किया ( सामग्री प्रकार के साथ)।

contentType के बिना::

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">"Now i am getting jsop string""2nd param"</string> 

contentType साथ :

{"d":"12"} 

तो दूसरा एक

यहाँ Chrome डेवलपर टूल में नेटवर्क टैब से प्रतिक्रियाएं हैं कम से कम जेएसओएन सर्वर से वापस आ रहा है परिणाम। तो सब कुछ बराबर है, मैं कहूंगा सामग्री टाइप जोड़ें।

आवश्यकताओं की व्याख्या JSON वापस जाने के लिए के लिए यहाँ देखें:

ASMX and JSON – Common mistakes and misconceptions

HTTP अनुरोध आवेदन/json की सामग्री प्रकार घोषित करना चाहिए। यह स्क्रिप्ट सेवा को सूचित करता है कि यह JSON के रूप में इसके पैरामीटर प्राप्त करेगा और इसे दयालु तरीके से जवाब देना चाहिए।

अब आपको अभी भी एक और समस्या है, और यही है कि अनुरोध पूरा होने पर, त्रुटि कार्य को कॉल करता है। यदि आप dataType: "jsonp" से dataType: "json" बदलते हैं तो यह सफलता कार्य को कॉल करेगा। तो कॉलबैक रैपर के आपके कार्यान्वयन के बारे में कुछ गलत है, क्योंकि jQuery जेएसओएनपी के रूप में प्रतिक्रिया को संभाल नहीं सकता है।

अब मैं कॉलबैक जवाब में लिपटे दिखाई नहीं दे रहा या तो, JSONP के लिए, प्रतिक्रिया की तरह कुछ किया जाना चाहिए:

jQuery17106476630216930062_1326752446188({"d":"12"}) 

मैं तुम्हें कैसे से एक JSONP प्रतिक्रिया करने के बारे में this post से लिंक कर रहे नोटिस एक वेब सेवा, लेकिन आप सलाह का पालन नहीं कर रहे हैं: आप Response.Filter का उपयोग नहीं करते हैं, इसके बजाय आप Response.Write का उपयोग करते हैं।

+0

काम नहीं कर रहा .... –

+0

हाँ, यह काम कर रहा है में परिवर्तित करने JSON करने के लिए, आप ने कहा: "समस्या: वेब सेवा लौटने एक्सएमएल जेसन के insted: "। मैंने अभी इस कोड का परीक्षण किया है, और आपकी वेब सेवा JSON के साथ प्रतिक्रिया देती है यदि आप केवल 'सामग्री टाइप: "एप्लिकेशन/जेसन जोड़ते हैं; charset = utf-8" ' –

+1

मैं सामग्री जोड़ने के बाद भी इसे काम करने में असमर्थ हूं टाइप:" एप्लिकेशन/json; charset = utf-8 "मुझे मिल रहा है: " 1 "" 2 "

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