Testando um Web-Site na própria máquina como se fosse externamente

Tentei elaborar um título de forma que ficasse entendível o que eu queria dizer. Não sei se ajuda, mas significa que:
"Testaremos o acesso a um web-site que está publicado no IIS mas que no navegador não iremos usar localhost para buscá-lo e sim o próprio endereço."
Ficou bom agora? Então vamos lá. No IIS crie um web-site. O processo é bem simples:


Pronto! Já temos nosso site, mas se formos testar: http://thiagomarcal.com.br/ não encontra!


Por que isso? Quando queremos procurar um site, o sistema operacional analisa o hostname para saber onde encontrar esse endereço: se for interno e mapeado usa-se a rede interna, senão procura a rede externa dentre outros. Como não existe o mapeamento e tampouco o domínio externo, não acha nada. Então vamos alterar o arquivo de host.

Siga para o caminho: C:\Windows\System32\drivers\etc e abra o arquivo hosts, em modo texto, para adicionarmos algumas entradas.

# copyright (c) 1993-2009 microsoft corp.
#
# this is a sample hosts file used by microsoft tcp/ip for windows.
#
# this file contains the mappings of ip addresses to host names. each
# entry should be kept on an individual line. the ip address should
# be placed in the first column followed by the corresponding host name.
# the ip address and the host name should be separated by at least one
# space.
#
# additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# for example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within dns itself.
#	127.0.0.1       localhost
#	::1             localhost

127.0.0.1	thiagomarcal.com.br

Coloque, na última linha, o IP, tabulação e nome do domínio nessa ordem para o site desejado. Salve e teste novamente o acesso. E pronto!


Mais fácil do que isso: impossível!

Consumindo Web-Service PHP através do ASP.NET (C#)

Já passou por aqui um post sobre de como consumir um web-service, mas era em ASP.NET. Agora como consumir um web-service em PHP? Da mesma forma. Não muda! O fato de escrever esse post é apenas e pelo simples fato de ter um certo inconveniente na elaboração do web-service em PHP.
Se procurar na net, recomendo o artigo de Maurício Reckziegel da iMasters que é muito bom e explica certinho como fazer. Se você seguir à risca o que está escrito irá conseguir elaborar um web-service em PHP normalmente e irá conseguir consumir, menos em ASP.NET. Não é que a matéria esteja errada, é porque o ASP.NET é chato com a validação do WSDL que é gerado pelo PHP. O documento (WSDL) tem que ser gerado na mão e, quando não é gerado de forma automática, estamos susceptíveis ao erro. Com o web-service em PHP é assim...
Então, digamos que você tenha elaborado o web-service em PHP e já fez referência na sua aplicação. Contudo sua aplicação pode dar erro ou retornar nada. Primeiramente, todo WSDL que iremos usar deve ser validado antes de ser devidamente consumido. O Visual Studio dispõe de uma ferramenta que valida e gera a classe consumidora (que não precisar ser usada pois está intrínseco na ferramenta). Vá em Iniciar > Todos os Programas > Microsoft Visual StudioVisual Studio ToolsVisual Studio 2008 Command Prompt. Irá abrir um prompt de comando. Escreva por exemplo: wsdl http://thiagomarcal.blogspot.com/webservice.php?wsdl . Se der tudo certo, irá surgir um resultado semelhante a esse:


Se estiver tudo OK, então pode usar tranquilamente, caso contrário irá surgir o seguinte problema:

Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.

Warning: This web reference does not conform to WS-I Basic Profile v1.1.

Ou seja, o WSDL gerado pelo PHP não está conforme o padrão. Dando uma alterada aqui e ali, podemos usar o seguinte código para gerarmos o web-service em PHP dentro dos conformes:

<?php
// Requerimento aos componentes
require_once('nusoap/nusoap.php');
include("class.phpmailer.php");
include("class.smtp.php");


// Criação da instância
$server = new soap_server();


// Registro do método
$server->register('EnviaMail');


// WSDL
$server->configureWSDL('server.EnviaMail','urn:server.EnviaMail');
$server->wsdl->schemaTargetNamespace = 'urn:server.EnviaMail';
// registra o método a ser oferecido
$server->register('EnviaMail', //nome do método
array('email' => 'xsd:string'), //parâmetros de entrada
array('return' => 'xsd:string'), //parâmetros de saída
'urn:server.EnviaMail', //namespace
'urn:server.EnviaMail#EnviaMail', //soapaction
'rpc', //style
'literal', //use
'Retorna se o e-mail foi enviado' //documentação do serviço
);


// Definição do método a ser utilizado
function EnviaMail($email) {
return "E-email enviado com sucesso!";
}


// Requisição para uso do serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Perceberam a diferença? Praticamente nenhuma, mas há: o estilo do documento. Não irei entrar em detalhes, mas dois tipos de documentos mais usados: encoded e literal (veja mais nesse artigo). Use literal! Com isso seu web-service será consumido certinho...
Se estiver com o erro: O cliente encontrou o tipo conteúdo de resposta de ' text/html; charset = utf-8 ', mas era esperado 'text/xml' ou The client find the answer 'text/html', but was expected 'text/xml'. verifique se seu web-service está imprimindo conteúdo HTML (echo) e comprometendo o retorno dos dados. Tranquilo, né?