5

TLDR;看最后一段。

我们合作软件公司的开发人员需要调用我们的 WCF(基本 http 绑定)服务,他要求我们自己将其转换为 asmx,因为他无法从 Oracle 调用它。WCF 服务正在不同平台(.net、java、php)上使用,没有错误。

他的代码给了他状态代码: 500 - Internal Server Error。我认为它与发送错误的肥皂格式或内容有关。

所以我知道你应该像那个开发者那样使用utl_dbws而不是utl_http 。

好的,首先这对我来说似乎是一件容易的事。从 Internet 上找到一个工作代码示例并发送一封电子邮件,例如“嗨,开发者朋友,您应该使用 utl_dbws 包而不是 utl_http 和此链接上的示例代码”。

我不是世界上唯一需要这样做的人,对吧?

很奇怪,但我找不到任何可以完成从 Oracle 调用 WCF 服务的示例批准的工作代码。

这是我找到的一些链接;

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/文章/10g/utl_dbws-10g.php

没有人编写任何工作代码示例,或者没有人告诉这是不可能的。

如果有人有一个从 Oracle 调用 WCF 服务的工作代码示例,我将不胜感激。

4

2 回答 2

0

当您收到 Http 500 错误时,通常是内部错误。例如,如果开发人员在没有设置所有输入值的情况下调用您的服务,那么您的代码可能会生成除以零错误,如果未捕获该错误,则会作为 http 500 错误返回给客户端。

您可以将 WCF 服务的 soap 版本配置为与 asmx 服务相同。

于 2012-12-17T21:11:54.587 回答
0

如果您从 WCF 服务收到响应 500(内部错误),请尝试在 WCF 服务的 web.config 中设置 includeexceptiondetailinfaults=true 。(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;
于 2014-12-16T17:56:25.347 回答