Em relação ao problema quando o serviço web escrito em C# é chamado em Delphi
Em primeiro lugar, penso que é necessário dar uma explicação relativamente abrangente do desenvolvimento de webservices na plataforma .net. A geração inicial de webservices surgiu no ambiente de comércio electrónico. Alguns problemas já não são fáceis de resolver através dos meios tradicionais. , como em aplicações. Para comunicação empresarial e troca de dados, não é mais viável utilizar mecanismos binários como dcom e corba. Sem falar que eles são limitados por suas respectivas plataformas, por exemplo, dcom (modelo de distribuição de objetos comuns). só pode ser executado na plataforma Windows, enquanto corba (broker de solicitação de objetos comuns arquitetura) é apenas um produto da plataforma java. É difícil para eles conseguirem comunicação de dados entre aplicativos.
Neste contexto, os serviços web surgiram conforme os tempos exigem. É uma boa solução para cross-linguagem, cross-plataforma e penetração boa e segura de firewalls corporativos. Sua arquitetura é geralmente dividida em cinco níveis:
Comunicação de dados no canal http (protocolo de transferência de hipertexto)
formulário de expressão de dados xml (linguagem de marcação extensível)
Encapsulamento de dados de sabão (protocolo de acesso a objetos simples)
Formato de linguagem de descrição do wsdl (linguagem de descrição de webservices)
uddi (descrição universal e integração de descoberta) descrição unificada, descoberta e integração
Ser multilíngue, multiplataforma e bom e seguro para penetrar firewalls corporativos é o suficiente para nos deixar entusiasmados. No entanto, também existem áreas que precisam de melhorias, como:
A comunicação de dados HTTP é lenta, especialmente na primeira conexão.
Requer a sobrecarga adicional de um servidor web
Depois de falar sobre a arquitetura de webservices e suas vantagens e desvantagens, vamos direto ao ponto, que é o tema da nossa discussão desta vez:
Problemas quando o serviço web service é chamado no Delphi
Sem mais delongas, vamos ilustrar com um exemplo simples de teste do atributo webmethod: é um processo de negócios simples de conclusão de uma transferência do cliente a para o cliente b.
Primeiro, criamos um serviço da web no framework .net 1.1. Neste momento, o .net criará automaticamente um aplicativo da web para nós.
Precisamos criar uma classe attributetest, que está no namespace attributetesting. Então, esta classe herdará automaticamente sua classe base system.web.services.webservice. Quando necessário, podemos definir a classe do aplicativo da web como seu atributo webservice, os atributos básicos incluem a descrição. e espaço para nome
[atributo de serviço da web (namespace = http://www.isdoo.com/services,
description=olá ansel, este é um serviço web de teste!)]
teste de atributo de classe pública: system.web.services.webservice
{
[webmethodattribute(description=Informações de descrição: Herda o método count e sobrecarrega o nome. A execução consiste em transferir dinheiro do usuário a para o usuário b...,
//nomedamensagem=alterando o nome da mensagem,
bufferresponse = verdadeiro,
duração do cache = 1000,
enablesession = verdadeiro,
opção de transação = opção de transação.requiresnew)]
transmoney de string pública (dinheiro duplo)
{
tentar
{
contextutil.enablecommit();//transação usada apenas para operação do banco de dados!
dinheiroema(dinheiro);
dinheiro fora deb(dinheiro);
contextutil.setcomplete();
transação de retorno bem-sucedida, total +money.tostring();
}
pegar (exceção e)
{
contextutil.setabort();
transação de retorno falhou! /n/r +e.message;
}
}
dinheiro vazio privado em um (dinheiro duplo)
{
sqlcommand sqlcom = novo sqlcommand(atualizar conjunto de orçamento money=money++money.tostring()+ where name='a');
acesso ao banco de dados meu banco de dados = novo acesso ao banco de dados();
sqlcom.connection=meudatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//lança nova exceção(operação falhou ao transferir dinheiro para a!);
}
dinheiro vazio privado fora deb (dinheiro duplo)
{
sqlcommand sqlcom = novo sqlcommand(atualizar conjunto de orçamento money=money-+money.tostring()+ where name='b');
acesso ao banco de dados meu banco de dados = novo acesso ao banco de dados();
sqlcom.connection=meudatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//lança nova exceção(operação falhou ao transferir dinheiro de b!);
}
}
Precisamos prestar atenção especial ao webmethodattribute, que também é o foco do que precisamos falar desta vez. Contanto que você adicione [webmethodattribute] a um método, mesmo que não haja atributos nele, então o webservice. irá expor este método ao chamador do segmento Cliente. Vamos falar sobre seus 6 atributos abaixo, incluindo 2 atributos de informação descritiva e 4 atributos funcionais.
Atributos de informação descritiva:
descrição
nome da mensagem
4 propriedades funcionais:
resposta do buffer
duração do cache
habilita sessão
opção de transação
Dentre eles, precisamos atentar para o atributo messagename Quando o Delphi chama o webservice desenvolvido na plataforma .net, se você definir o atributo messagename, um erro será reportado quando o cliente o chamar. Isso pode ser um bug, talvez uma versão posterior resolva esse problema. Quanto às funções específicas destes atributos, elas não serão descritas em detalhes aqui. Você pode ler livros relevantes.
Abaixo vou listar os passos para o Delphi chamar o webservice:
Primeiro de tudo, se você apenas desenvolver e chamar o cliente, então você só precisa criar um aplicativo comum. Então, o que você precisa fazer é encontrar o controle soaphttpclient na barra de ferramentas de serviços da web e colocá-lo no corpo da janela do aplicativo cliente. ;
Em segundo lugar, você precisa definir o atributo url ou wsdl deste soaphttpclient. Este conteúdo é o endereço de serviço do seu webservice.
Por exemplo, o endereço de serviço do nosso exemplo atual é: http://localhost/attributetesting/attributetesting.asmx
Se você deseja inserir wsdl, é http://localhost/attributetesting/attributetesting.asmx?wsdl
Isto completa as configurações de controle;
Então precisamos importar o wsdl do lado do servidor. Você pode fazer isso manualmente ou usar a função de importador de webservices fornecida pelo Delphi.
Finalmente, você só precisa chamar a interface wsdl importada. Nosso código correspondente aqui é:
procedimento tform1.bitbtn1click(remetente: tobject);
var
aa:attributetestsoap;//Este é o objeto de interface de classe sob wsdl
mensagem:string larga;
bb:duplo;
começar
//httprio2 é na verdade a chamada classe proxy, responsável pela transmissão de dados, envio de solicitações e aceitação de respostas.
aa:=httprio2 como atributotestsoap;
bb:=100,00;
msg:=aa.transmoney(bb);//Este é o método de serviço web webmethod exposto a nós chamando o serviço web
mostrar mensagem(mensagem);
fim;
ok, isso é tudo!
Downloads populares de código-fonte comercial www.html.org.cn