2009-07-23 9 views
5

का उपयोग कर जावास्क्रिप्ट से बाहरी सर्वर पर कॉल webservice पर कॉल करें, मैं एक एएसपी.NET पृष्ठ का उपयोग कर वेब सेवा कॉल का परीक्षण करने की कोशिश कर रहा हूं जो उपयोगकर्ता नाम और पासवर्ड फ़ील्ड और "सबमिट" बटन के साथ एक फॉर्म बनाता है। (JQuery और .js फ़ाइल दोनों का उपयोग मैं मुख्य तत्व में स्क्रिप्ट टैग में शामिल कर रहा हूं।)एएसपीनेट और सी #

"सबमिट" बटन फ़ाइल के पीछे सी # कोड में बनाए गए फ़ंक्शन को कॉल करता है जो एक अलग जावास्क्रिप्ट को कॉल करता है फ़ाइल।

protected void mSubmit_Click(object sender, EventArgs eventArgs) 
{ 
    String authenticate = String.Format("Authentication(\"{0}\",\"{1}\");", this.mUsername.Text,this.mPassword.Text); 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", authenticate, true); 
} 

JavaScript फ़ंक्शन, Authenticate, वेब सेवा कॉल करता है, jQuery और अजाक्स का उपयोग, एक अलग सर्वर के लिए, JSON मापदंडों भेजने और जवाब में वापस JSON उम्मीद।

function Authentication(uname, pwd) { 

    //gets search parameters and puts them in json format 
    var params = '{"Header":{"AuthToken":null,"ProductID":"NOR","SessToken":null,"Version":1},"ReturnAuthentication":true,"Password":"' + pwd + '","Username":"' + uname + '",”ReturnCredentials”:false }'; 

    var xmlhttp = $.ajax({ 
     async: false, 
     type: "POST", 
     url: 'https://myHost.com/V1/Identity/Authenticate', 
     data: params, 
     contentType: 'application/json' 
    }); 

    alert(xmlhttp.statusText); 
    alert(xmlhttp.responseText); 

    return; 
} 

हालांकि, क्योंकि वेब सेवा मैं फोन कर रहा हूँ ASP.NET, सी # और JavaScript फ़ाइलों तुलना में एक अलग सर्वर पर है, मैं नहीं एक statusText या responseText चेतावनी हो रही है।

किसी भी तरह, वेब सेवा पर कुछ भी नहीं भेजा जा रहा है और मुझे कुछ भी वापस नहीं मिल रहा है, यहां तक ​​कि कोई त्रुटि भी नहीं। मैंने beforeSend विशेषता में एक फ़ंक्शन डालने का प्रयास किया, लेकिन यह आग नहीं लगा। क्या ऑफ-सर्वर वेब सेवा को कॉल करने के लिए मुझे एक विशेष तरीका चाहिए?

अद्यतन!

jjnguy, जेनी और नेथन की सलाह पर, अब मैं HttpWebRequest का उपयोग कर वेब सेवा के लिए सर्वर साइड कॉल करने का प्रयास कर रहा हूं। Jjnguy के कोड के साथ-साथ this question से कोड का उपयोग करके, मैं इसके साथ आया हूं।

public static void Authenticate(string pwd, string uname) 
{ 
    string ret = null; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://myhost.com/V1/Identity/Authenticate"); 
    request.ContentType = "application/json"; 
    request.Method = "POST"; 

    string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":false }'"; 

    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    request.ContentLength = byteData.Length; 

    using (Stream postStream = request.GetRequestStream()) 
    { 
     postStream.Write(byteData, 0, byteData.Length); 
    } 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    using (response) 
    { 
     // Get the response stream 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 

     // Console application output 
     ret = reader.ReadToEnd(); 
    } 

    Console.WriteLine(ret); 
} 

हालांकि, मैं दूरस्थ सर्वर से एक (400) Bad Request त्रुटि जब मैं अपने HttpWebRequest से प्रतिक्रिया प्राप्त करने की कोशिश हो रही है। अपवाद की प्रतिक्रिया संपत्ति का मूल्य {System.Net.HttpWebResponse} कहता है और स्थिति संपत्ति का मूल्य ProtocolError है। मुझे यकीन है कि ऐसा इसलिए है क्योंकि यूआरएल HTTP एसएसएल प्रोटोकॉल का उपयोग कर रहा है। एएसपी.NET पृष्ठ यूआरएल HTTPS के साथ शुरू होने के अलावा (विकल्प नहीं) के अलावा, मैं इसके आसपास क्या करने के लिए क्या कर सकता हूं?

+0

यह एक रूबे गोल्डबर्ग शैली समाधान है, आपको बहुत सरलता की आवश्यकता होगी। – Janie

+0

सहमत हुए। मुझे खुशी है कि हम एक ही पृष्ठ पर हैं। – jjnguy

+0

क्या आप ब्राउज़र से सेवा देख सकते हैं? – Janie

उत्तर

3

मेरे अपडेट में जो कोड मैंने पोस्ट किया है उसे सही करता है, मेरे पास डेटा स्ट्रिंग में एक टाइपो और एक सेटिंग गलत थी।

string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":true}"; 
2

सादगी के लिए, आप सर्वर साइड पर सी # में webservice को कॉल क्यों नहीं लिखते?

आपके पास अनुरोध भेजने और सी # में प्रतिक्रियाएं प्राप्त करने के समान हैं, जैसा कि आप जावास्क्रिप्ट के साथ करते हैं।

public static string Authenticate(string pwd, string uname) 
{ 
    HttpWebRequest requestFile = (HttpWebRequest)WebRequest.Create("https://myHost.com/V1/Identity/Authenticate"); 
    requestFile.ContentType = "application/json"; 
    requestFile.Method = "POST"; 
    StreamWriter postBody = new StreamWriter(requestFile.GetRequestStream()) 
    using (postBody) { 
     postBody.Write("{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":false }'"); 
    } 
    HttpWebResponse serverResponse = (HttpWebResponse)requestFile.GetResponse(); 
    if (HttpStatusCode.OK != serverResponse.StatusCode) 
     throw new Exception("Url request failed. Connection to the server inturrupted"); 
    StreamReader responseStream = new StreamReader(serverResponse.GetResponseStream()); 
    string ret = null; 
    using (responseStream) { 
     ret = responseStream.ReadLine(); 
    } 
    return ret; 
} 

अस्वीकरण यह परीक्षण नहीं किया गया:

यहाँ सी # में अपने समारोह में एक दरार है।

+0

मुझे आशा है कि आप वहां कुछ ब्लॉक का उपयोग करने जा रहे हैं। मैं दो वोट नीचे हूं - मुझे आप पर _use_ एक नहीं बनाओ ... –

+0

ठीक है, बीमार मेरी धाराओं का ख्याल रखता है – jjnguy

+0

पेज। मैं सी # में बहुत अच्छा नहीं हूँ। – jjnguy

1

सर्वर से अनुरोध करने के लिए क्लाइंट स्क्रिप्ट का उपयोग करने के बजाय; इस सवाल का जवाब विस्तार करने के लिए अनुरोध

संपादित करने के लिए सर्वर साइड कोड का उपयोग करें:

दृश्य स्टूडियो में अपने वेब परियोजना से, वेब संदर्भ, और सेवा आप मूल रूप से अपने ग्राहक स्क्रिप्ट के द्वारा एक्सेस कर रहे थे करने के लिए बिंदु जोड़ने पर क्लिक करें: (मैं मान लीजिए कि यह 'https://myHost.com/V1/Identity/Authenticate)

अब आप जेएस के बजाय सी # कोड का उपयोग कर सेवा से बात कर सकते हैं (और उपयोगकर्ताओं को प्रमाण पत्र प्रदान करते हैं।)

इसके अलावा, चूंकि सेवा के खिलाफ अनुरोध ब्राउज़र से बजाए सर्वर से आ रहा है; आप लागू होने वाले क्रॉस-डोमेन प्रतिबंधों को बाईपास करते हैं।

को और संपादित अतिरिक्त तकनीक को दिखाने के लिए:

आप आप के लिए एक सेवा प्रॉक्सी उत्पन्न करने के लिए दृश्य स्टूडियो का उपयोग करने का विचार पसंद नहीं है, तो आप अपने आप को अनुरोध WebClient या HttpRequest

का उपयोग कर सकते हैं handcraft WebClient: http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx

HttpWebRequest: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(VS.80).aspx

+0

मुझे अपने वेब प्रोजेक्ट में उस सेवा तक पहुंच नहीं है। यह कोड बेस के एक अलग हिस्से में है जहां मेरी फाइलें हैं। –

+0

मैं समझता हूं कि; वीएस एक प्रॉक्सी ऑब्जेक्ट उत्पन्न करेगा जो आपकी ओर से उस सेवा के साथ बातचीत करेगा। आपके पास सभी विधियों तक पहुंच होगी ... – Janie

+0

विनिर्देशों के लिए jjnguy के समाधान पर एक नज़र डालें ... – Janie

0

लगता है जैसे आप एक ही या में चला रहे हैं igin नीति

http://en.wikipedia.org/wiki/Same_origin_policy 

मुझे विश्वास है कि इसे रोकने के तरीके हैं, लेकिन मुझे लगता है कि अन्य पोस्टर सही हैं। सर्वर पर, वेब सेवा को कॉल करने के लिए HttpWebRequest का उपयोग करने वाले विधियां लिखें, और उसके बाद जेएसओएन को पार्स करने के लिए जावास्क्रिप्टसेरियलज़र का उपयोग करें। मैंने इस कारण शोध करने में दोपहर का अधिकांश खर्च किया, मुझे कुछ ऐसा ही लिखना होगा।

>>>> Nathan 

पीएस मुझे @ जेनी की योजना बेहतर पसंद है ... क्या आप ऐसा वेब सेवा कर सकते हैं जो जेएसओएन के साथ-साथ एक्सएमएल को वापस कर देगा?

+0

@ jjnguy की योजना के बारे में क्या? – jjnguy

+0

आपने जावास्क्रिप्टसेरियलज़र नहीं जोड़ा है।/जेके मैं अभी भी उत्सुक हूं यदि आप JSON सेवाओं के लिए प्रॉक्सी कक्षाएं बना सकते हैं ... ऐसा लगता है कि यह मेरी मशीन पर काम नहीं कर रहा है ... – Nathan

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