2012-11-19 9 views
5

टीएलडीआर से डब्ल्यूसीएफ सेवा उपभोग; अंतिम अनुच्छेद देखें।ओरेकल

हमारी सहयोगी सॉफ्टवेयर कंपनी से एक डेवलपर हमारे WCF (बुनियादी http बंधन) सेवा को कॉल करने की जरूरत है, और वह इसे चालू करने के लिए कहा कारण वह ओरेकल से बुला के साथ परेशानी है, खुद के लिए ASMX करने के लिए। डब्ल्यूसीएफ सेवा का इस्तेमाल विभिन्न प्लेटफार्मों (.net, जावा, php) पर बिना किसी त्रुटि के किया जा रहा है।

उसका कोड उसे स्थिति कोड देता है: 500 - आंतरिक सर्वर त्रुटि। मैं इसे गलत साबुन प्रारूप या सामग्री भेजने के बारे में मानता हूं।

तो मैं के रूप में है कि डेवलपर किया आप utl_http utl_dbws बजाय का उपयोग करना चाहिए सीखा है।

ठीक है, यह मेरे लिए पहले एक आसान काम लग रहा था। इंटरनेट से एक वर्किंग कोड नमूना पाएं और "हाय साथी डेवलपर मित्र" जैसे ई-मेल भेजें, आपको utl_dbws पैकेज का उपयोग नहीं करना चाहिए और इस लिंक पर नमूना कोड नहीं है "।

मैं दुनिया में एकमात्र ऐसा व्यक्ति नहीं हूं जिसे ऐसा करने की ज़रूरत है, है ना?

अजीब लेकिन मुझे कोड का कोई भी नमूना अनुमोदित कामकाजी टुकड़ा नहीं मिला जो ओरेकल से डब्ल्यूसीएफ सेवा को कॉल करने को पूरा करता है।

यहां कुछ लिंक हैं जो मुझे इसके बारे में मिला;

https://forums.oracle.com/forums/thread.jspa?threadID=2354357 https://forums.oracle.com/forums/thread.jspa?threadID=1071996 http://steveracanovic.blogspot.com/2008/10/using-utldbws-package-to-call-web.html https://forums.oracle.com/forums/thread.jspa?messageID=4205205&tstart=0#4205205
http://www.oracle-base.com/articles/10g/utl_dbws-10g.php

नूने किसी भी काम कर कोड उदाहरण लिखते हैं या कोई नहीं बताता है कि यह संभव नहीं है।

यदि कोई कामकाजी कोड उदाहरण था तो ओरेकल से डब्ल्यूसीएफ सेवा को कॉल करने पर मैं सराहना करता हूं।

+1

मेरे पास अतीत में UTL_DBWS के साथ एक सरल खेल है, जिसे सरल वेब सेवाओं पर कॉल करने के लिए मिला है, पाया गया है कि यह विशेष रूप से अच्छी तरह से काम नहीं करता है और इसके लिए अधिक समर्थन नहीं मिला है। मैं इसके बजाय UTL_HTTP का उपयोग कर समाप्त हुआ। –

+0

@ जेफरी केम्प, क्या आपने यूटीएल_एचटीटीपी के साथ डब्ल्यूसीएफ कॉल करने में कामयाब रहे? – berdem

+0

मैंने पहले कभी डब्ल्यूसीएफ सेवाओं का उपयोग नहीं किया है। –

उत्तर

0

जब आपको एचटीपी 500 त्रुटि मिलती है तो यह आमतौर पर आंतरिक त्रुटि होती है। उदाहरण के लिए कि डेवलपर सभी इनपुट मानों को सेट किए बिना आपकी सेवा को कॉल कर रहा है, तो आपका कोड शून्य त्रुटि से विभाजित कर सकता है, जो पकड़ा नहीं जाता है, क्लाइंट को http 500 त्रुटि के रूप में वापस कर दिया जाता है।

आप एक डब्ल्यूसीएफ सेवा के साबुन संस्करण को एएसएमएक्स सेवा के समान ही कॉन्फ़िगर कर सकते हैं।

0

यदि आपको डब्ल्यूसीएफ सेवा से प्रतिक्रिया 500 (आंतरिक त्रुटि) मिल रही है, तो डब्ल्यूसीएफ सेवा includexceptiondetailinfaults = true के web.config में सेट करने का प्रयास करें। (http://msdn.microsoft.com/cs-cz/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults(v=vs.110).aspx)

तो फिर तुम विस्तृत अपवाद (गलत साबुन कार्रवाई, गलत प्रारूप ...) PL/SQL से

कॉल WCF सेवा मिल जाएगा।

utl_http लेकिन यह काम करता है।

/* 
    declare 
    p_request VARCHAR(32767); 
    p_plainResult VARCHAR2(32767); 
    begin 
    p_request := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:Sum> 
     <tem:a>1</tem:a> 
     <tem:b>2</tem:b> 
     </tem:Sum> 
    </soapenv:Body> 
</soapenv:Envelope>'; 

select callSOAPService(p_request,'http://tempuri.org/IMathService/Sum','http://localhost:51106/MathService.svc') into p_plainResult from dual;  
    end; 

    */ 
create or replace function callSOAPService 
( 
p_plainRequest IN varchar2(20000), 
p_actionName IN varchar2(1024), --SOAP Action (in WCF, attribute [OperationContract(Action="ActionName") 
p_url IN varchar2(1024), 
    p_userName varchar2(1024) := null, 
    p_password varchar2(1024) := null, 
    p_isAsynchronous boolean:= FALSE, 
    p_proxy varchar2(1024):=null, 
    p_transferTimeout number :=null, 
) 
RETURN VARCHAR2(32767) 
IS 
    p_charset varchar2(1024) :='AL32UTF8'; --by default utf-8 
    p_request utl_http.req; 
    p_response utl_http.resp; 
    p_plainResponse varchar2(32767); 
BEGIN 

    p_url := utl_url.escape(url => p_url); --escape url 

    if p_TransferTimeout > 0 THEN --set oracle timeout (by defualt is 60 sec) 
    utl_http.set_transfer_timeout(timeout => p_transferTimeout); 
    END IF; 

    if p_proxy IS NOT NULL THEN --if proxy is provided, then set it 
    utl_http.set_proxy(proxy => p_proxy); 
    end if; 
    utl_http.set_response_error_check(enable => TRUE); --http status errorCheck (404 not found, 500 internal error...) 
    utl_http.set_detailed_excp_support(enable => TRUE); --detailed error stack 

    p_request := UTL_HTTP.begin_request(url => p_url,method => 'POST' /*u SOAP bude vzdy POST meotda*/ ,http_version => 'HTTP/1.1'); 

    --pripravim si obalku 
    UTL_HTTP.set_header (r => p_request,name => 'Content-Type', value => 'text/xml'); 
    UTL_HTTP.set_header (r => p_request,name => 'Content-Length',value => LENGTH (p_plainRequest)); 
    UTL_HTTP.set_header (r => p_request, name => 'SOAPAction',value => p_actionName); --if status is 500 check SOAP action 
    UTL_HTTP.write_text(r => p_request,data => p_plainRequest); 

    p_response := UTL_HTTP.get_response (p_request); 

    if p_isAsynchronous THEN --one-way service 
     UTL_HTTP.end_response (p_response); --proto ukoncim request a vratim prazdno 
     RETURN ''; 
    end if; 

    utl_http.read_text (p_response, p_plainResponse); --read response 
    utl_http.end_response (p_response); --close resposne 

    dbms_output.put_line ('Response from: ' || p_url || ' is ' || p_plainResponse); --vypisu odpoved pro kontrolu 
    return p_plainResponse; 
EXCEPTION 
    when others then  
     dbms_output.put_line('Chyba ' || UTL_HTTP.get_detailed_sqlerrm()); --get error stack 
     utl_http.end_response (p_response); 
END;