2012-11-19 4 views
5

TLDR; 마지막 paragrap을보십시오.Oracle에서 WCF 서비스 사용 중

파트너 소프트웨어 회사의 개발자가 WCF (basic http binding) 서비스에 전화해야하며 그는 오라클에서 전화하는 데 어려움을 겪으므로 스스로 asmx로 전환하도록 요청했습니다. WCF 서비스가 다른 플랫폼 (.net, java, php)에서 오류없이 사용 중입니다.

코드를 입력하면 상태 코드 : 500 - 내부 서버 오류이 표시됩니다. 잘못된 비누 형식이나 내용을 보내는 것으로 가정합니다.

그래서 난 그 개발자가 그랬던 것처럼 당신이 UTL_HTTP utl_dbws 대신 를 사용해야합니다 배웠습니다.

좋아,이게 나에게 쉬운 일 이었어. 인터넷에서 작동하는 코드 샘플을 찾아서 "안녕 동료 개발자 친구와 같이 utl_hwp가 아닌 utl_dbws 패키지와이 링크의 샘플 코드를 사용해야합니다."와 같은 전자 메일을 보내십시오.

전 세계에서이 작업을 수행해야하는 유일한 사람이 아닙니까?

이상하지만 오라클에서 WCF 서비스를 호출하는 코드 샘플을 찾지 못했습니다.

여기 내가 찾은 링크 중 일부입니다. 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

https://forums.oracle.com/forums/thread.jspa?threadID=2354357 아무도 어떤 작업 코드 예제를 작성 또는 아무도이 불가능하다는 것을 알려줍니다.

Oracle에서 WCF 서비스를 호출하는 작업 코드 예제가 있다면 감사하게 생각합니다.

+1

, 그것은 특히 잘 작동하지 않았고, 그것을 위해 많은 지원을 찾지 못했습니다 발견. 대신 UTL_HTTP를 사용하여 종료되었습니다. –

+0

@ Jeffrey Kemp, UTL_HTTP로 WCF 호출을 처리 했습니까? – berdem

+0

전에 WCF 서비스를 사용한 적이 없습니다. –

답변

0

Http 500 오류가 발생하면 일반적으로 오류입니다. 예를 들어 개발자가 모든 입력 값을 설정하지 않고 서비스를 호출하는 경우 코드에서 0으로 나누기 오류를 생성 할 수 있습니다.이 오류는 catch되지 않으면 http 500 오류로 클라이언트에 반환됩니다.

WCF 서비스의 SOAP 버전을 asmx 서비스와 동일하게 구성 할 수 있습니다.

0

WCF 서비스에서 응답 500 (내부 오류)이 발생하면 WCF 서비스 includeexceptiondetailinfaults = true의 web.config에서 설정을 시도하십시오. (http://msdn.microsoft.com/cs-cz/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults(v=vs.110).aspx)

그럼 당신은 자세한 예외 (잘못된 비누 액션, 잘못된 형식 ...) PL/SQL에서

전화 WCF 서비스를 받게됩니다.

utl_http하지만 작동합니다.

나는 간단한 웹 서비스를 호출 할 수있는 과거에 UTL_DBWS와 연극을 했어요
/* 
    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; 
관련 문제