2010-10-05 10 views
5

में पैरामीटर प्राप्त करने और जवाब देने से इंकार कर देती है मैं जेसन प्रारूप में एक सी # एप्लिकेशन से एक वेब सेवा (.asmx) को कॉल करने का प्रयास कर रहा हूं।वेब सेवा जेएसओएन

जब मैं अनुरोध विधि निर्दिष्ट करता हूं, और सामग्री टाइप निर्दिष्ट नहीं करता हूं।

(अनुरोध HttpWebRequest है)

req.Method = "GET"; 

सब कुछ अच्छी तरह से काम करता है, लेकिन मैं XML प्रतिक्रिया मिलता है।
जब मैं सामग्री प्रकार निर्दिष्ट करें:

req.ContentType = "application/json; charset=utf-8"; 

मैं

500 आंतरिक सर्वर त्रुटि मिलता है।

जब मैं अनुरोध पद्धति को बदलने:

req.Method = "POST"; 

मैं parameterless तरीकों केवल कॉल कर सकते हैं, जो सही ढंग से json देता है, लेकिन अगर मैं मानकों के साथ एक विधि बुला की कोशिश, मैं फिर से 500 त्रुटि मिलती है।

वेब सेवा कोड:

[WebMethod(EnableSession =true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string SimplestWebService() 
    {   
     return "hello"; 
    } 

और साथ पैरामीटर:

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string Echo(string aString) 
    {  
     return aString; 
    } 

कोई भी विचार बहुत सराहना की जाएगी।

जोड़ा गया: शायद मैं POST अनुरोध सही नहीं लिख रहा हूं (अब मैं इसे हेडर में भेज रहा हूं, बस एक जीईटी अनुरोध की तरह)। क्या कोई व्यक्ति इसके बारे में मेरा मार्गदर्शन कर सकता है?

मोड कहा: वेब साइट वास्तव में स्क्रिप्ट के रूप में चिह्नित किया गया है:

[ScriptService] 
public class MyAPI : System.Web.Services.WebService 

और यहाँ है कैसे मैं अपने पोस्ट अनुरोध निर्माण (मैं वास्तव में यही समस्या है पर विश्वास करने के लिए करते हैं):

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl.ToString()); 
req.Method = "POST"; 
req.Headers.Add("aString","oren"); 
req.ContentLength = 0;  
... 
req.ContentType = "application/json; charset=utf-8"; 
req.Accept = "application/json; charset=utf-8"; 
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
{ 
    StreamReader sr = new StreamReader(res.GetResponseStream()); 
    result.Append(sr.ReadToEnd()); 
} 
... 

भी करने की कोशिश की:

req.Method = "POST";   
string postData = "aString=kjkjk"; 
req.ContentType = @"application/json; charset=utf-8"; 
req.Accept = @"application/json; charset=utf-8"; 
ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] byte1 = encoding.GetBytes(postData); 
req.ContentLength = byte1.Length; 
Stream newStream = req.GetRequestStream(); 
newStream.Write(byte1, 0, byte1.Length); 
newStream.Close();   

दो पिछले नोटों:
1. यह वेब सेवा ब्राउज़र का उपयोग कर एक्सएमएल में काम करती है।
2. जेसन के लिए पूछे जाने पर, कोड वेब सेवा पर ब्रेक पॉइंट तक कभी नहीं पहुंचता है। तो यह संभवतः एक आईआईएस (मैं आईआईएस 6.1 का उपयोग कर रहा हूं) मुद्दा है। मैंने एमआईएमई प्रकार की सिफारिश here की कोशिश की है।

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

+0

क्या आप कोड शामिल कर सकते हैं जहां आप आउटगोइंग अनुरोध को कॉन्फ़िगर करते हैं? विशेष रूप से, आप "aString" पैरामीटर कैसे जोड़ रहे हैं? इससे समस्या को डीबग करने में मदद मिल सकती है। – mikemanne

+0

इसके अलावा, एएसएमएक्स वर्ग स्वयं ही टैग की गई है: [स्क्रिप्ट सेवा]? मुझे लगता है कि (100% निश्चित नहीं) POST-mod अनुरोधों और JSON- स्वरूपित डेटा का उपयोग कर webservice तक पहुंचने के लिए आवश्यक है। – mikemanne

+0

@ मिकमैन: इनपुट के लिए बहुत बहुत धन्यवाद। अपडेट किया गया। –

उत्तर

5

अद्यतन 2:

मैं Fiddler2 उपयोग कर रहा हूँ एक सफल पोस्ट अनुरोध (jQuery से मेरी ASMX सेवा करने के लिए) को देखने के लिए, और मैं एक अंतर यह है कि मूल्य की जाँच हो सकता है देखते हैं:

Accept: application/json, text/javascript, */* 

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

अपडेट किया गया उत्तर (अद्यतन सवाल के जवाब में):

ऐसा लगता है कि आप contentStream उचित प्रयोग कर रहे। हालांकि, जिस डेटा पर आप इसे दबा रहे हैं ("aString = kjkjk") मान्य JSON नहीं है। के रूप में नीचे वर्णित है, अपने डेटा मान्य JSON प्रारूप में होने की जरूरत होने की संभावना होगी:

{'aString':'kjkjk'} 

मूल उत्तर:

मेरा मानना ​​है कि आप गलत तरीके से "aString" सामग्री स्थापित कर रहे हैं। पोस्ट-विधि अनुरोधों के लिए, हेडर पर "पेलोड" डेटा लागू नहीं होता है, यह अनुरोध की सामग्री ही है। इसलिए, आपको अनुरोध ऑब्जेक्ट पर इसे स्ट्रीम करने की आवश्यकता है; उदाहरण के लिए this MSDN reference देखें। अनुरोध की सामग्री-लंबाई भी सेट करना न भूलें।

चूंकि आप JSON (और JSON को सामग्री-प्रकार के रूप में निर्दिष्ट करते हैं) के माध्यम से सेवा को कार्यान्वित कर रहे हैं, मुझे विश्वास है कि आपको एक JSON स्ट्रिंग को कच्चे बाइट्स में कनवर्ट करने की आवश्यकता होगी, और यही वह है जिसे आप इसे दबाएंगे धारा। आपका JSON स्ट्रिंग कुछ इस तरह दिखना चाहिए:

{'aString':'This is the text I want to echo.'} 

आप कुछ ठीक करने करने के लिए आवश्यकता हो सकती है (मैं एक जगह है जहाँ मैं आसानी से एक साथ एक सटीक कोड नमूना रख सकते हैं पर नहीं कर रहा हूँ), लेकिन यह आप मिलना चाहिए सही दिशा में जा रहा है।

+0

अभी भी कोई भाग्य नहीं है .. अधिक विशिष्ट उत्तर की आवश्यकता है –

+0

एक मूर्ख बात: सुनिश्चित करें कि आपका यूआरएल (methodUrl) सही webservice (htp: //yourmachine/MyAPI.asmx/Echo) को लक्षित कर रहा है।(जानबूझकर गलत वर्तनी 'http' ताकि यह इस टिप्पणी में सही ढंग से दिखाई दे) – mikemanne

+0

मुझे खुद से शर्मिंदा होना चाहिए (-:। आपको अभी तक 22 घंटे (एसओ नियम) में बकाया नहीं दे सकता। धन्यवाद। –

0

ContentType मुझे अनुरोध का सामग्री-प्रकार होने का प्रतीत होता है, प्रतिक्रिया नहीं। क्या होता है यदि आप इसके बजाय Accept शीर्षलेख भेजते हैं (सामग्री-प्रकार के सर्वर को सूचित करते हैं जिन्हें आप स्वीकार करना चाहते हैं)।

+0

जीईटी और पोस्ट दोनों के साथ बिल्कुल वही परिणाम। –

+0

इसे फिडलर में चेक किया गया, और मुझे एक जेसन प्रतिक्रिया मिल रही है: {"संदेश": "अनुरोध को संसाधित करने में त्रुटि हुई।", "स्टैकट्रेस": "", "अपवाद टाइप": ""} (और 500 आंतरिक सर्वर शीर्षलेख में त्रुटि) –

+0

इसके अलावा, अगर मैं सामग्री टाइप को छोड़ने का प्रयास करता हूं, तो मुझे एक XML प्रतिक्रिया मिलती है। –