2012-11-19 14 views
5

TLDR; guarda l'ultimo paragrafo.Il consumo di servizio WCF da Oracle

Uno sviluppatore dalla nostra società di software partner ha bisogno di chiamare il nostro WCF (http base vincolante) di servizio, e lui ci ha chiesto di girare a ASMX per se stessi, perché lui ha problemi con chiamandolo da Oracle. Il servizio WCF viene utilizzato su piattaforme diverse (.net, java, php) senza errori.

Il suo codice gli dà Codice di stato: 500 - Errore interno server. Presumo che si tratti di inviare formati o contenuti di sapone errati.

così ho imparato che si dovrebbe usare utl_dbws invece di UTL_HTTP come quella sviluppatore ha fatto.

Ok, questo mi è sembrato un compito facile. Trovare un esempio di codice che lavora da internet e inviare un e-mail come "Ciao amico collega sviluppatore si dovrebbe usare utl_dbws pacchetto non UTL_HTTP e il codice di esempio a questo link".

Non sono l'unica persona al mondo che ha bisogno di fare questo, giusto?

Strano ma non sono riuscito a trovare alcun pezzo di codice di esempio approvato che comporti la chiamata a un servizio WCF da Oracle.

Ecco alcuni dei link che ho trovato su di esso;

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

Nessuno scrive qualsiasi esempio di codice di lavoro o nessuno dice che questo non è possibile.

Apprezzerei se qualcuno avesse un esempio di codice funzionante che chiamava un servizio WCF da Oracle.

+1

Ho avuto un gioco con UTL_DBWS in passato per chiamare semplici servizi Web, trovato che non funzionava particolarmente bene e non trovava molto supporto per questo. Ho finito per utilizzare invece UTL_HTTP. –

+0

@Jeffrey Kemp, hai riuscito a lavorare WCF chiama con UTL_HTTP? – berdem

+0

Non ho mai usato i servizi WCF prima. –

risposta

0

Quando si verifica un errore Http 500, di solito è un errore interno. Per esempio che lo sviluppatore sta chiamando il servizio senza impostare tutti i valori di input, il codice potrebbe quindi generare un errore di divisione per zero, che quando non è catturato viene restituito al client come un errore HTTP 500.

È possibile configurare la versione soap di un servizio WCF come se fosse un servizio asmx.

0

Se si riceve la risposta 500 (errore interno) dal servizio WCF, provare a impostare in web.config del servizio WCF includeexceptiondetailinfaults = true. (http://msdn.microsoft.com/cs-cz/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults(v=vs.110).aspx)

Poi si aprirà eccezione dettagliata (azione sapone sbagliato, formato sbagliato ...)

chiamata servizio WCF da PL/SQL.

UTL_HTTP ma funziona.

/* 
    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; 
Problemi correlati