Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo T Fonseca

[Resolvido] NuSoap WebServices

Recommended Posts

Bom dia a todos.

 

Criei uma função em um Webservice, que traz um arquivo gravado no banco de dados MSSQL, se eu faço a chamada pela URL do WebService, o procedimento funciona normalmente, mas quando eu tento trazer via NuSoap, o mesmo me retorna o erro "Response not of type text/xml: text/html".

 

A rotina deveria dar um prompt para eu poder salvar o arquivo ou abrir, semelhante ao funcionamento na chamada pela URL do WebService.

 

Abaixo segue minha função em C# e a chamada em PHP.

[WebMethod]
public string RetornaArquivo(string setupannotationid)
{
Guid annotationId = new Guid(setupannotationid);

CrmAuthenticationToken token = new CrmAuthenticationToken();
token.OrganizationName = "Organization";
token.AuthenticationType = 0;

CrmService _service = new CrmService();
_service.Url = "http://mysite.com/MSCrmServices/2007/CrmService.asmx";

_service.CrmAuthenticationTokenValue = token;
_service.Credentials = new System.Net.NetworkCredential("user", "password", "domain");

ColumnSet cols = new ColumnSet();
cols.Attributes = new string[] { "filename", "documentbody", "mimetype" };

annotation annotationAttachment = (annotation)_service.Retrieve(EntityName.annotation.ToString(), annotationId, cols);

byte[] fileContent = Convert.FromBase64String(annotationAttachment.documentbody);

Context.Response.ClearHeaders();
Context.Response.Clear();

Context.Response.AddHeader("content-disposition", "attachment; filename=" + annotationAttachment.filename);
Context.Response.BinaryWrite(fileContent);
Context.Response.End(); 

}

-------------

<?php
require_once('lib/nusoap.php');

$client = new nusoap_client('http://mysite.com/WService/WService.asmx?wsdl', true);

$err = $client->getError();

if ($err) {
echo "Erro na Construção do objeto";
echo $err;
}

$ap_param = array("setupannotationid" => "xxxxxxxxxxxxxxxxx");
$result = $client->call('RetornaArquivo', $ap_param);
?>

 

Agradeço a ajuda de todos.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

A rotina deveria dar um prompt para eu poder salvar o arquivo ou abrir, semelhante ao funcionamento na chamada pela URL do WebService.

 

Isso não vai acontecer, o PHP estará executando no servidor não no navegador do usuário, consequentemente não haverá "prompt" perguntando uma localização para salvar o arquivo.

 

Para que você consiga esse resultado, você deverá consumir o serviço, recuperar o arquivo com o PHP e, somente então, disponibilizar para download.

 

O webservice deverá entregar o conteúdo do arquivo como base64, isso é definido no schema do seu WSDL, o elemento que trafegará o arquivo deverá ser do tipo base64Binary e você deverá convertê-lo para seu formato original ao recebê-lo no PHP.

 

Pode ser interessante trafegar o nome do arquivo e também um checksum para validação.

 

Um ponto que notei no seu código do serviço, é que você está enviando o conteúdo para a saída, isso não deve acontecer. SOAP trata-se de um protocolo de transporte de objetos, sendo assim, você deve retornar objetos da mesma forma que faria em uma chamada de um método qualquer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A rotina deveria dar um prompt para eu poder salvar o arquivo ou abrir, semelhante ao funcionamento na chamada pela URL do WebService.

 

Isso não vai acontecer, o PHP estará executando no servidor não no navegador do usuário, consequentemente não haverá "prompt" perguntando uma localização para salvar o arquivo.

 

Para que você consiga esse resultado, você deverá consumir o serviço, recuperar o arquivo com o PHP e, somente então, disponibilizar para download.

 

O webservice deverá entregar o conteúdo do arquivo como base64, isso é definido no schema do seu WSDL, o elemento que trafegará o arquivo deverá ser do tipo base64Binary e você deverá convertê-lo para seu formato original ao recebê-lo no PHP.

 

Pode ser interessante trafegar o nome do arquivo e também um checksum para validação.

 

Um ponto que notei no seu código do serviço, é que você está enviando o conteúdo para a saída, isso não deve acontecer. SOAP trata-se de um protocolo de transporte de objetos, sendo assim, você deve retornar objetos da mesma forma que faria em uma chamada de um método qualquer.

 

João,

 

Primeiramente, sua ajuda foi muito essencial para resolver o problema, o qual foi resolvido.

 

Abaixo eu vou deixar para ajuda de futuros problemas o que foi feito.

 

Rotina do WebService (Somente para esclarecimento o retorno "Resultado" meu sistema devolve um array completo)

[WebMethod]
public Resultado RetornaArquivo(string setupannotationid)
{
   Guid annotationId = new Guid(setupannotationid);

   CrmAuthenticationToken token = new CrmAuthenticationToken();
   token.OrganizationName = "Organization";
   token.AuthenticationType = 0;

   CrmService _service = new CrmService();
   _service.Url = "http://mysite.com/MSCrmServices/2007/CrmService.asmx";

   _service.CrmAuthenticationTokenValue = token;
   _service.Credentials = new System.Net.NetworkCredential("user", "password", "domain");

   ColumnSet cols = new ColumnSet();
   cols.Attributes = new string[] { "filename", "documentbody", "mimetype" };

   annotation annotationAttachment = (annotation)_service.Retrieve(EntityName.annotation.ToString(), annotationId, cols);

   string fileContent = annotationAttachment.documentbody;

   Resultado result = new Resultado();
   Erro err = new Erro();

   err.Descricao = fileContent;
   result.Fault = true;
   result.Erros = new Erro[] { err };
   return result;
}

Rotina PHP

<?php
   require_once('lib/nusoap.php');

   $client = new nusoap_client('http://mysite.com/WService/WService.asmx?wsdl', true);

   $err = $client->getError();

   if ($err) {
       echo "Erro na Construção do objeto";
       echo $err;
   }

   $ap_param = array("setupannotationid" => "xxxxxxxxxxxxxxxxx");
   $result = $client->call('RetornaArquivo', $ap_param);

   if ($client->fault) {
   } else {
       $err = $client->getError();

       if ($err) {
           echo $err;
       } else {
           foreach ($result as $key => $first) {
           }
           foreach ($first as $key => $second) {
           }
           foreach ($second as $key => $third) {
           }

           $Nome_Arquivo = "Erro.docx";
           $fp = fopen($Nome_Arquivo, "wb");
           fwrite($fp, base64_decode($third));
           fclose($fp);
       }
   }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.