2012-11-19 31 views
5

TLDR;最後のパラグラップを見てください。OracleからのWCFサービスの使用

パートナーソフトウェア会社からの開発者は、私たちのWCFサービス(基本的なHTTPはを結合)を呼び出す必要がある、と彼はオラクルからそれを呼び出すことでトラブルを持っている原因、自分自身のためASMXするためにそれを回すために私たちを尋ねました。 WCFサービスが異なるプラットフォーム(.net、java、php)でエラーなしで使用されています。

彼のコードは彼にステータスコード:500 - 内部サーバーエラーを与えます。私は間違った石鹸のフォーマットや内容を送っていると仮定します。

だから私は、開発者が行ったようにあなたの代わりにUTL_HTTPUTL_DBWSを使用する必要があります学びました。

これはわかりやすい作業だったようです。インターネットから実用的なコードサンプルを探して、 "こんにちは友人の開発者の友人、あなたはutl_httpではなくutl_dbwsパッケージを使用し、このリンクのサンプルコードを使うべきです"のような電子メールを送ってください。

私はこれを行う必要がある世界で唯一の人ではありませんか?

奇妙なものですが、Oracleから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_DBWSを使って簡単なWebサービスを呼び出すことができました。特にうまく機能せず、多くのサポートが見つかりませんでした。代わりにUTL_HTTPを使用しました。 –

+0

@Jeffrey Kemp、あなたはUTL_HTTPでWCF呼び出しを処理できましたか? – berdem

+0

私はかつてWCFサービスを使ったことがありません。 –

答えて

0

Http 500エラーが発生した場合、通常エラーです。たとえば、開発者がすべての入力値を設定せずにサービスを呼び出している場合、コードでゼロ除算が生成され、キャッチされなかった場合は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から詳細な例外(間違ったSOAPアクション、間違ったフォーマット...)

コール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; 
関連する問題