2011-08-14 2 views
6

मैं डब्ल्यूसीएफ आराम सेवा में नया हूं। मुझे समस्या नहीं मिली, मेरी डब्ल्यूसीएफ आराम से सेवा क्यों 'बुरी अनुरोध' दे रही है। मैं .NET 4.0 का उपयोग करता हूं।JSON अनुरोध द्वारा fiddler से wcf restful सेवा को कैसे कॉल करें?

मेरी सेवा है:

[OperationContract(Name="Add")] 
[WebInvoke(UriTemplate = "test/", Method = "POST", 
      ResponseFormat=WebMessageFormat.Json, 
      RequestFormat=WebMessageFormat.Json)] 
public int Add(Number n1) 
{ 
    res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2); 
    return res; 
} 

डाटा हैं ..

[Serializable] 
    public class Number 
    { 
     public int Number1 { get; set; } 
     public int Number2 { get; set; } 
    } 

जब मैं Fiddler अपनी वापसी से फोन के HTTP/1.1 400 गलत अनुरोध '

मेरा फिडलर अनुरोध हेडर है:

User-Agent: Fiddler 
Host: localhost:4217 
Content-Type: application/json; charset=utf-8 

और अनुरोध शरीर है:

{"Number1":"7","Number2":"7"} 

और प्रतिक्रिया हेडर है:

HTTP/1.1 400 Bad Request 
Server: ASP.NET Development Server/10.0.0.0 
Date: Sun, 14 Aug 2011 18:10:21 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 5450 
Cache-Control: private 
Content-Type: text/html 
Connection: Close 

लेकिन अगर मैं सी # क्लाइंट प्रोग्राम द्वारा इस सेवा को कॉल यह ठीक है।

मेरे क्लाइंट कोड है:

uri = "http://localhost:4217/Service1.svc/"; 
Number obj = new Number() { Number1 = 7, Number2 = 7 }; 
using (HttpResponseMessage response = new HttpClient().Post(uri+"test/", 
     HttpContentExtensions.CreateDataContract(obj))) 
{ 
    string res = response.Content.ReadAsString(); 
    return res.ToString(); 
} 

कृपया मेरी मदद करो ........

धन्यवाद।

उत्तर

8

तरह से आप अपने कोड के साथ इस मुद्दे बाहर मिल जाएगा enable tracing लिए है सर्वर पर , और इसमें समस्या को समझाते हुए एक अपवाद होगा। मैं अपने कोड के साथ एक साधारण परीक्षण लिखा था, और यह एक समान त्रुटि (400) था, और निशान निम्न त्रुटि थी:

The data contract type 'WcfForums.StackOverflow_7058942+Number' cannot be 
deserialized because the required data members '<Number1>k__BackingField, 
<Number2>k__BackingField' were not found. 

डेटा प्रकार [Serializable] के साथ चिह्नित वस्तु में सभी क्षेत्रों को क्रमानुसार, नहीं गुण।उस विशेषता बाहर टिप्पणी करके, कोड वास्तव में ठीक (प्रकार फिर "POCO" में गिर जाता है (प्लेन ओल्ड Clr वस्तु) नियम, जो सभी सार्वजनिक क्षेत्रों और गुण को धारावाहिक बाहर काम करता है।

public class StackOverflow_7058942 
{ 
    //[Serializable] 
    public class Number 
    { 
     public int Number1 { get; set; } 
     public int Number2 { get; set; } 
    } 
    [ServiceContract] 
    public class Service 
    { 
     [OperationContract(Name = "Add")] 
     [WebInvoke(UriTemplate = "test/", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] 
     public int Add(Number n1) 
     { 
      int res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2); 
      return res; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(Service), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebClient c = new WebClient(); 
     c.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8"; 
     c.Encoding = Encoding.UTF8; 
     Console.WriteLine(c.UploadString(baseAddress + "/test/", "{\"Number1\":\"7\",\"Number2\":\"7\"}")); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
2

एक चीज जो आप गलत कर रहे हैं वह अनुरोध वस्तु का प्रारूप है। इसे चालू करें:

{ n1: { "Number1":"7","Number2":"7"} } 

पैरामीटर नाम जेसन ऑब्जेक्ट के मूल संपत्ति नाम हैं जो एक डब्ल्यूसीएफ जेसन एंडपॉइंट पर पास किए गए हैं।

मेरे पास गिट पर sample wcf service है। अन्य चीजों के अलावा, इसमें एक जेसन एंडपॉइंट है और Default.asmx में मैं इसे कॉल करने के लिए jquery का उपयोग करता हूं। मैं सुझाव दूंगा कि आप एक समान वेबपृष्ठ बनाएं (इसे डब्ल्यूसीएफ सेवा के समान वेबसाइट पर होस्ट करें) जो आपके जेसन सेवा को jquery के माध्यम से कॉल करता है और उस के साथ सेवा का परीक्षण करता है जबकि फिडलर नमूना अनुरोध प्राप्त करने के लिए दौड़ रहा है। यह अनुरोध स्वयं को बनाने के बजाय आसान और कम त्रुटि प्रवण होगा क्योंकि jquery हेडर में बहुत सारे विवरणों का ख्याल रखेगा।

मेरी गूंज सेवा फोन करने के लिए नमूना jQuery ajax कोड है कि आप अपने सेवा के लिए अनुकूलित कर सकते हैं इस प्रकार है:

$("#btnEchoString").click(function() { 
     var request = $("#request"); 
     var response = $("#response"); 
     $.ajax({ 
      url: 'EchoService.svc/JSON/Echo', 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify({ request: request.val() }), 
      dataType: "json", 
      success: function (data) { 
       response.val(data.d); 
      }, 
      error: function (request, status, error) { 
       //TODO: do something here 
      } 
     }); 
    }); 
+1

"सामान्य" उपयोग डब्ल्यूसीएफ आरईएसटी '' व्यवहार (या 'वेबहैट्टेबायवरर', कोड के माध्यम से) का उपयोग करना है, न कि आपके नमूने में '' जो आपके पास है। के लिए, डिफ़ॉल्ट बॉडीस्टाइल 'बेयर' है, जिसका अर्थ है कि आप पैरामीटर नाम के साथ किसी JSON ऑब्जेक्ट में ऑब्जेक्ट को लपेटने की आवश्यकता नहीं है ( के लिए डिफ़ॉल्ट 'लपेटा हुआ है')। – carlosfigueira

+0

कार्लोस, स्पष्टीकरण के लिए धन्यवाद! –