2013-05-28 11 views
7

पर जेएसओएन डेटा पोस्ट करते समय मैं सी # और डब्ल्यूसीएफ में बनाई गई सेवा में कुछ JSON डेटा भेजने की कोशिश कर रहा हूं।त्रुटि 415 जब डब्ल्यूसीएफ सेवा

Request Header 
User-Agent: Fiddler 
Host: localhost 
Content-Length: 29 
Content-Type: application/json; charset=utf-8 

Request Body 
{sn:"2705", modelCode:1702 } 

नीचे सेवा इंटरफ़ेस है: Fiddler में मेरी पोस्ट अनुरोध के रूप में

फ़िडलर इस प्रकार है। यही कारण है कि पोस्ट अनुरोध

[ServiceContract] 
public interface IProjectorService 
{ 
    [WebInvoke(Method="POST", UriTemplate="projectors", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)] 
    [OperationContract] 
    void RecordBreakdown(Record record); 
} 

सेवा इंटरफ़ेस के कार्यान्वयन चर तर्क को में पारित लेता है और किसी SQL डाटाबेस को यह डेटा भेजने के लिए हलचल का उपयोग करता है का प्रबंधन करने के WebInvoke विशेषता का उपयोग करता। ,

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5"/> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 

Fiddler में जब मैं पर क्लिक करें ":

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public partial class ProjectorService : IProjectorService 
{ 

    public void RecordBreakdown(Record record) 
    { 
     //ado code to send data to db (ie do record.SerialNumber... 
    }   
} 

POCO वस्तु से अधिक पैरामीटर

[DataContract] 
public class Record 
{  
    [DataMember] 
    public string SerialNumber { get; set; } 
    [DataMember] 
    public int ModelCode { get; set; } 
} 

.svc फ़ाइल

<%@ ServiceHost Language="C#" Debug="true" Service="ProjectorService" CodeBehind="~/App_Code/ProjectorService.cs" %> 

Web.config प्रतिनिधित्व करने के लिए निष्पादित करें ", मुझे एक त्रुटि 415" असमर्थित मीडिया ty प्राप्त होता है पीई"। विचार की मेरी वर्तमान पंक्ति यह है कि मेरे प्रोजेक्टर सेवा वर्ग में, शायद मुझे एक प्रतिक्रिया वस्तु बनाना चाहिए और 200 कोड वापस भेजना चाहिए ?!

उत्तर

8

एक WCF endpoint [WebInvoke] (या [WebGet]) एनोटेशन पहचान करने के लिए के लिए यह एक WebHTTP समाप्ति बिंदु (यानी बाकी अंतिम बिंदु) के रूप में परिभाषित किया जाना चाहिए। चूंकि आपने web.config में किसी भी एंडपॉइंट्स को परिभाषित नहीं किया है, इसलिए यह योजना के लिए डिफ़ॉल्ट बाध्यकारी का उपयोग कर रहा है, जो BasicHttpBinding है। उस बाध्यकारी के साथ अंतराल केवल एक्सएमएल (एसओएपी) अनुरोधों का जवाब देते हैं, यही कारण है कि JSON अनुरोध भेजते समय आपको वह त्रुटि मिल रही है।

अपने web.config में अपने <system.serviceModel> अनुभाग के बजाय ऐसे हैं, और जैसा कि आप इसकी आवश्यकता है कि अपने अंतिम बिंदु परिभाषित करना चाहिए:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="Web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <services> 
     <service name="ProjectorService"> 
     <endpoint address="" 
        behaviorConfiguration="Web" 
        binding="webHttpBinding" 
        contract="IProjectorService" /> 
     </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
+0

Thats काम किया। मैंने सोचा कि वेब बाध्यकारी स्वचालित रूप से एसवीसी फ़ाइल में फैक्ट्री विधि का उपयोग करके जेनरेट की गई थी (जिसे मैंने वैसे भी शामिल नहीं किया था)। साथ ही साथ इन परिवर्तनों को मुझे 'BodyStyle = WebMessageBodyStyle.Bare' को सेवा विधि में विज्ञापन करने की आवश्यकता थी क्योंकि JSON डेटा किसी अन्य ऑब्जेक्ट में लपेटा नहीं गया था। – beaumondo

5

समस्या सबसे अधिक संभावना है कि आपकी सेवा विधि के लिए 2 पैरामीटर की आवश्यकता है। डिफ़ॉल्ट केवल 1 बॉडी पैरामीटर मौजूद हो सकता है।

आप इसे 2 तरीकों से ठीक कर सकते हैं। सबसे पहले जिस तरह से: अपने WebInvoke को Bodystyle = WebMessageBodyStyle.Wrapped जोड़ें ताकि जैसे गुण:

[WebInvoke(Method = "POST", UriTemplate = "projectors", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
void RecordBreakdown(string sn, int modelCode); 

दूसरा तरीका: पोस्ट डेटा के लिए एक कक्षा बनाएं। उदाहरण के लिए आप जेएसओएन के रूप में अपनी सेवा में पोस्ट करने के लिए सभी वेरिएबल्स के लिए एक कक्षा बना सकते हैं। जेएसओएन से कक्षाएं बनाने के लिए आप Json2CSharp (या जेएसओएन को वीएस2012 अपडेट 2 में कक्षाओं के रूप में पेस्ट कर सकते हैं) का उपयोग कर सकते हैं। निम्नलिखित JSON

{"sn":2705, "modelCode":1702 } 

निम्नलिखित वर्ग में परिणाम होगा:

कि आप ऐसा तरह इस वर्ग को स्वीकार करने के अपने तरीके को बदलने के लिए होगा के बाद:

void RecordBreakdown(string sn, int modelCode); 

रहे हैं:

void RecordBreakdown(Record record); 

उसके बाद अब आप सेवा में JSON पोस्ट करने में सक्षम होना चाहिए।

आशा है कि इससे मदद मिलती है!

संपादित करें: इस से नीचे से मेरे उत्तर में शामिल हों।

अपनी कॉन्फ़िगरेशन फ़ाइल को फिर से देखने के बाद, यह बाध्यकारी गलत कॉन्फ़िगरेशन की तरह दिखता है।डब्ल्यूसीएफ के लिए डिफ़ॉल्ट बाध्यकारी एक 'बासिक हेल्प बाइंडिंग' है जो मूल रूप से SOAP 1.1 का उपयोग कर रहा है।

चूंकि आप JSON और एक RESTFUL सेवा का उपयोग करना चाहते हैं, तो आपको 'webHttp बाइंडिंग' का उपयोग करना होगा। Here is a link एक बुनियादी विन्यास के लिए हम हमेशा हमारी आरईएसटीफुल सेवाओं के लिए उपयोग कर रहे हैं। सुरक्षित परिवहन (f.e .: https) की आवश्यकता होने पर आप सुरक्षा मोड को परिवहन में सेट कर सकते हैं। जो webHttpBinding और webHttp endpoint व्यवहार का उपयोग कर का मतलब है -

<security mode="Transport"></security> 
+0

मैं जोड़ने Bodystyle = WebMessageBodyStyle.Wrapped लेकिन यह काम नहीं किया है की कोशिश की है। अभी भी 415 त्रुटि प्राप्त हो रही है। मैंने कई मापदंडों को भी हटा दिया है और आपके सुझाव के आधार पर एक नई कक्षा बनाई है, मैं इस तरह से पसंद करता हूं इसलिए मुझे लगता है कि मैंने इन परिवर्तनों को दिखाने के लिए प्रश्न अपडेट किया है, लेकिन यह भी काम नहीं करता है मैं अभी भी त्रुटि 415 देख रहा हूं। – beaumondo

+1

फिर से देखने के बाद आपकी कॉन्फ़िगरेशन फ़ाइल, यह बाध्यकारी गलत कॉन्फ़िगरेशन की तरह दिखती है। डब्ल्यूसीएफ के लिए डिफ़ॉल्ट बाध्यकारी एक 'बासिक हेल्प बाइंडिंग' है जो मूल रूप से SOAP 1.1 का उपयोग कर रहा है। चूंकि आप JSON और एक RESTFUL सेवा का उपयोग करना चाहते हैं, इसलिए आपको 'webHttp बाइंडिंग' का उपयोग करना होगा। मैंने एक बुनियादी विन्यास के लिए एक लिंक शामिल किया है जिसे हम हमेशा हमारी आरईएसटीफुल सेवाओं के लिए उपयोग कर रहे हैं। :) जानकारी: [लिंक] (http://pastebin.com/Yj4bdrHp) – Xciles

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