2017-06-26 10 views
5

मैं jQuery के साथ AJAX कॉल से WCF सेवा को कॉल करने का प्रयास कर रहा हूं। मैं एसओएपी-यूआई और एक्सेल/वीबीए से डब्ल्यूसीएफ को कॉल करने का प्रबंधन करता हूं। मेरे समस्या विकल्प अनुरोध है कि भेज दिया जाता है से आता है और कोई पोस्ट इस प्रकार है:जावास्क्रिप्ट से डब्ल्यूसीएफ सेवा कैसे कॉल करें?

  • अगर मैं http://mywcf/service.svc का URL सेट, विकल्प भेज दिया जाता है और मैं एक 400 Bad Request स्थिति प्राप्त और पोस्ट अनुरोध नहीं भेजा जाता है। इस मामले में, शीर्षलेख में HTTP/1.1 गुम है (SOAP-UI शीर्षकों की तुलना में)।
  • यदि मैं http://mywcf/service.svc HTTP/1.1 पर यूआरएल सेट करता हूं, तो विकल्प भेजे जाते हैं और मुझे 200 OK स्थिति मिलती है लेकिन POST अनुरोध नहीं भेजा जाता है। इस मामले में, HTTP/1.1 को फ़ाइल नाम के रूप में व्याख्या किया जा रहा है।

क्या कोई मुझे बता सकता है कि जावास्क्रिप्ट से डब्लूसीएफ पर पोस्ट कार्रवाई कैसे कॉल करें और सेवा URL को दूषित किए बिना HTTP/1.1 शीर्षलेख जोड़ने के लिए?

var soapData = '' 
     +'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:mic="http://microsoft.wcf.documentation">' 
     +' <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsrm="http://docs.oasis-open.org/ws-rx/wsrm/200702">' 
     +'  <wsrm:Sequence>' 
     +'   <wsrm:Identifier>s:Sender a:ActionNotSupported</wsrm:Identifier>' 
     +'   <wsrm:MessageNumber>1</wsrm:MessageNumber>' 
     +'  </wsrm:Sequence>' 
     +'  <wsa:Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</wsa:Action>' 
     +'  <wsa:ReplyTo>' 
     +'   <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>' 
     +'  </wsa:ReplyTo>' 
     +'  <wsa:MessageID>uuid:'+ MsgUid +'</wsa:MessageID>' 
     +'  <wsa:To>'+ Url +'</wsa:To>' 
     +' </soap:Header>' 
     +' <soap:Body xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">' 
     +'  <wsrm:CreateSequence>' 
     +'   <wsrm:AcksTo xmlns:wsa="http://www.w3.org/2005/08/addressing">' 
     +'    <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>' 
     +'   </wsrm:AcksTo>' 
     +'   <wsrm:Offer>' 
     +'    <wsrm:Identifier>urn:soapui:'+ SeqUid +'</wsrm:Identifier>' 
     +'   </wsrm:Offer>' 
     +'  </wsrm:CreateSequence>' 
     +' </soap:Body>' 
     +'</soap:Envelope>'; 

$.ajax({ 
    type: 'POST', 
    url: 'http://mywcf/service.svc', // with or without +' HTTP/1.1' 
    data: soapData, 
    contentType: 'application/soap+xml;charset=UTF-8', 
    dataType: 'xml' 
}); 

मेरी WCF web.config में मान::

यहाँ मेरी ajax कॉल से एक उद्धरण है

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Methods" value="POST, OPTIONS" /> 
      <add name="Access-Control-Allow-Headers" value="*" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+1

एक स्पष्ट मुद्दा आपके कॉल में यूआरएल है। आपको यूआरएल – Sparrow

+0

@ डब्ल्यूपीएफ विधि नाम में डब्ल्यूसीएफ विधि नाम शामिल करने की आवश्यकता है, मैं विधि नाम सेट किए बिना वीबीए और एसओएपी-यूआई से डब्ल्यूसीएफ को कॉल करने का प्रबंधन करता हूं। जब मैं अपने AJAX कॉल में एक विधि नाम जोड़ता हूं, तो इसे फ़ाइल नाम के रूप में समझा जाता है। मुझे नहीं लगता कि यह एक समाधान है। – sinsedrix

+0

नीचे वोट वोट उनकी पसंद की व्याख्या कर सकते हैं, धन्यवाद। – sinsedrix

उत्तर

0

जोड़े WebHttpBinding endpoint

<services> 
    <service name="Contract"> 
    <endpoint address="json" binding="webHttpBinding" contract="IContract" bindingConfiguration="ActionsHttpBinding" behaviorConfiguration="ActionrestfulBehavior"/> 
    </service> 

तो पोस्ट के रूप में ajax से अंत बिंदु पर कॉल करें या मिलता है, उदाहरण के नीचे देखें:

var data = JSON.stringify({ 
    param1: val1, 
    param2: val2 
}); 
$.ajax({ 
    url: "http://mywcf/service.svc/json/FunctionName", 
    type: "POST", 
    data: data, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    processData: true 
}).then(function (rsutlt) { 

}).fail(function (fail) { 
}); 
0

अपने वेब config से अपने global.asax.cs लिए नीचे दिए गए कोड को जोड़ें, और customHeaders को हटा दें।

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      //These headers are handling the "pre-flight" OPTIONS call sent by the browser 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
      HttpContext.Current.Response.End(); 
     } 

    } 

इसके अलावा आपको कॉर्स को सक्षम करने के लिए OPTIONSVerbHandler को हटाने की आवश्यकता है।

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 
1

jQuery का उपयोग कर एक वेब सेवा का उपभोग करने के लिए, कि WCF सेवा करने के लिए एक फोन करना है, आप या तो jQuery.ajax() या jQuery.getJSON का उपयोग()। इस आलेख में मैंने jQuery.ajax() विधि का उपयोग किया था।

अनुरोध सेट करने के लिए, पहले एक चर परिभाषित करें। जब आप कई तरीकों को बुला रहे हैं और WCF सेवा को कॉल करने के लिए एक अलग जेएस फ़ाइल बना रहे हैं तो यह सहायक होगा।

<script type="text/javascript"> 

    var Type; 
    var Url; 
    var Data; 
    var ContentType; 
    var DataType; 
    var ProcessData; 

निम्न फ़ंक्शन सेवा को कॉल करने के लिए ऊपर परिभाषित चर को प्रारंभ करता है।

function WCFJSON() { 
    var userid = "1"; 
    Type = "POST"; 
    Url = "Service.svc/GetUser"; 
    Data = '{"Id": "' + userid + '"}'; 
    ContentType = "application/json; charset=utf-8"; 
    DataType = "json"; varProcessData = true; 
    CallService(); 
} 

कॉल सेवा कर्मचारी $ .ajax में डेटा सेट करके सेवा के लिए अनुरोध भेजता है।

// Function to call WCF Service  
function CallService() { 
    $.ajax({ 
     type: Type, //GET or POST or PUT or DELETE verb 
     url: Url, // Location of the service 
     data: Data, //Data sent to server 
     contentType: ContentType, // content type sent to server 
     dataType: DataType, //Expected data format from server 
     processdata: ProcessData, //True or False 
     success: function(msg) {//On Successfull service call 
      ServiceSucceeded(msg); 
     }, 
     error: ServiceFailed// When Service call fails 
    }); 
} 

function ServiceFailed(result) { 
    alert('Service call failed: ' + result.status + '' + result.statusText); 
    Type = null; 
    varUrl = null; 
    Data = null; 
    ContentType = null; 
    DataType = null; 
    ProcessData = null; 
} 

नोट: निम्न कोड result.GetUserResult बयान की जांच करता है, तो आपके परिणाम वस्तु संपत्ति आपकी सेवा विधि नाम + परिणाम हो जाता है। अन्यथा, यह जावास्क्रिप्ट में ऑब्जेक्ट की तरह कोई त्रुटि नहीं देगा।

function ServiceSucceeded(result) { 
    if (DataType == "json") { 
     resultObject = result.GetUserResult; 

     for (i = 0; i < resultObject.length; i++) { 
      alert(resultObject[i]); 
     } 

    } 

} 

function ServiceFailed(xhr) { 
    alert(xhr.responseText); 

    if (xhr.responseText) { 
     var err = xhr.responseText; 
     if (err) 
      error(err); 
     else 
      error({ Message: "Unknown server error." }) 
    } 

    return; 
} 

$(document).ready(
    function() { 
     WCFJSON(); 
    } 
); 
</script> 
संबंधित मुद्दे