Arquivo

Arquivo da Categoria ‘.NET’

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.

21, junho, 2010

Na semana passada estávamos mexendo em uma aplicação desenvolvida em .NET 2.0. O objetivo era incluir uma nova funcionalidade que dependia de um Web Service SOAP de terceiros.

Para fazer a nova implementação o mais rápido possível, utilizamos o recurso “Add Web Reference…” do Visual Studio 2005 para criar um proxy para o Web Service que queríamos consumir.

Fazendo isso, o Visual Studio 2005 gera algumas classes no arquivo Reference.cs (para visualizá-lo é preciso estar com a opção “Show all files” habilitada na janela Solution Explorer).

A partir dessas classes você pode fazer a comunicação com o Web Service através de simples chamadas de métodos.

CalcPrecoPrazoWS proxy = new CalcPrecoPrazoWS();
Resultado resultado = proxy.Calcular("03478010", "13500313", "0,456");

O problema

Até aqui tudo certo, mas quando testamos a aplicação fazendo a chamada do Web Service, aconteceu o seguinte erro:

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.
at System.Web.Services.Protocols.WebClientProtocol.Ge tWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

Depois de pesquisarmos um pouco, descobrimos que as possíveis causas desse problema são:

  • Quando o servidor do Web Service inesperadamente fecha a conexão
  • O time out do servidor do Web Service é muito baixo
  • O servidor do Web Service “reseta” a conexão inesperadamente, algo como uma exceção não tratada

A solução

Quando você chama um método da classe proxy, no exemplo acima a classe CalcPrecoPrazoWS, internamente a classe SoapHttpClientProtocol, que é a classe base do nosso proxy, aciona seu método protegido GetWebRequest, que irá fazer um requisição Web através da classe WebRequest.

Para não mantermos a “conexão viva” na requisição Web, sobrescrevemos o método GetWebRequest da classe SoapHttpClientProtocol, convertendo um objeto WebRequest em um objeto HttpWebRequest e configurando a propriedade KeepAlive para false antes de acionar a requisição.

protected override WebRequest GetWebRequest(Uri uri)
{
    HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    webRequest.ProtocolVersion = HttpVersion.Version10;

    return webRequest;
}

Isso pode ser feito no próprio arquivo Reference.cs, dentro da classe proxy que foi gerada pelo Visual Studio 2005. Mas qualquer alteração na referência Web, o Visual Studio 2005 irá gerar novamente o código do arquivo Reference.cs e seu código será apagado.

Então a melhor maneira de fazer isso é utilizar os recursos de classes parciais do .NET e separar seu código em um arquivo separado, como mostrado no exemplo abaixo:

public partial class CalcPrecoPrazoWS
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
        webRequest.KeepAlive = false;
        webRequest.ProtocolVersion = HttpVersion.Version10;

        return webRequest;
    }
}

Mas não é só isso

Há também um série de outras causas para esse problema, bem como outras possíveis soluções, inclusive quando você está usando WCF no .NET 3.5.

A solução que apresentei funcionou no meu caso. Se ela não resolver seu problema, vale a pena investigar nesse artigo do suporte da Microsoft que lista possíveis causas e soluções:

You receive one or more error messages when you try to make an HTTP request in an application that is built on the .NET Framework 1.1 Service Pack 1
http://support.microsoft.com/kb/915599

Esse artigo é um tanto confuso e mal organizado, mas já é um bom começo.

.NET , , , , , ,

Enterprise Library 5.0 release final liberada para download

26, abril, 2010

Microsoft Enterprise Library é uma coleção de blocos de código desenhados para auxiliar desenvolvedores .NET com tarefas comuns de desenvolvimento.

Esta versão inclui:

  • Caching Block
  • Cryptography Block
  • Data Access Block
  • Exception Handling Block
  • Logging Block
  • Policy Injection Block
  • Security Block
  • Validation Block
  • Unity

A melhor versão da Enterprise Library contém novas características e atualizações que irão deixar os desenvolvedores .NET mais produtivos. Entre elas estão:

  • Refatoração da arquitetura que provê testabilidade e manutenabilidade através de um completo suporte à injeção de dependência
  • Contêiner de injeção de dependência independente (Unity é entregue com Enterprise Library, mas você pode substituí-lo por um outro contêiner de sua preferência)
  • Suporte à configuração programática, incluindo uma interface de configuração fluente e um esquema XSD para permitir IntelliSense
  • Reformulação da ferramenta de configuração
  • Processamento de resultados de consultas de dados mais intuitivo
  • Suporte a acesso de dados assíncrono
  • Atributos de validação entre Validation Application Block e DataAnnotations
  • Integração com mecanismos de validação do Windows Presentation Foundation (WPF)
  • Suporte a cenários de configuração complexos, o que inclui mesclagem de múltiplos arquivos de configuração
  • Liberação de cachê otimizada
  • Melhor performance para operações de log
  • Redução do número de assemblies
  • Suporte ao .NET Framework 4.0 e integração com Visual Studio 2010
  • Melhorias no Unity

Para fazer o download da Enterprise Library 5.0, bem como documentação, detalhes da versão, extensões e vídeos, acesse o link abaixo:
http://msdn.microsoft.com/en-us/library/ff632023.aspx

.NET, Arquitetura , , , , , , ,

A promoção Segunda Chance de certificações Microsoft voltou

5, fevereiro, 2010

A promoção Segunda Chance (”Second Shot”, em inglês) voltou para lhe ajudar a passar em seu próximo exame de certificação Microsoft. Essa promoção lhe dá o direito de refazer um exame caso você não consiga passar na primeira tentativa.

Você deve realizar tanto o primeiro e o segundo exame (se necessário) antes de 30 de junho de 2010. A promoção é valida para todos os exames de certificações Microsoft Learning IT professional, developer, project management, e Microsoft Dynamics.

Para se cadastrar na promoção Segunda Chance, siga as instruções dessa página:
http://www.microsoft.com/learning/Career/en/us/career-offer.aspx#certification

.NET , , , ,

Melhores posts do ano de 2009

8, janeiro, 2010

Vídeos da PDC 2009 estão disponíveis

29, novembro, 2009

Nos dias 17 a 19 de novembro, aconteceu em Los Angeles a PDC 2009, Professional Developers Conference, evento anual organizado pela Microsoft para desenvolvedores focados nas plataformas de desenvolvimento da empresa.

A organização do evento disponibilizou mais de 200 vídeos (e alguns slides) das apresentações para download. Para baixar os vídeos acesse esse endereço.

.NET, Eventos , , , , ,

[Tradução] Qual é a diferença entre os operadores “as” e “cast”?

29, outubro, 2009

Muitas pessoas lhe dirão que a diferença entre “(Alpha) bravo” e “bravo as Alpha” é que o primeiro lança uma exceção se a conversão falhar, enquanto que o segundo retorna null. De qualquer forma isso é correto, e isso é a diferença mais óbvia, mas não é a única diferença. Há armadilhas para se tomar cuidado aqui.

Primeiro, desde que o resultado do operador “as” pode ser null, o tipo do resultado precisa ser um dos que aceitam um valor nulo: um tipo referência ou tipo valor nullable. Você não pode fazer “as int”, isso não faz sentido. Se o argumento não é um int, então qual valor de retorno deveria ser? O tipo da expressão “as” é sempre um tipo nomeado, então ele precisa ser um tipo que pode receber null.

Segundo, o operador cast, como eu discuti antes, é uma besta estranha. Ele significa duas coisas contraditórias: “verifique para ver se o objeto realmente é desse tipo, lance uma exceção se não for” e “esse objeto não é do tipo informado; encontre um valor equivalente que pertença ao tipo informado”. O segundo significado do operador cast não é compartilhado pelo operador “as”. Se você diz

short s = (short)123;
int? i = s as int?;

então você está sem sorte. O operador “as” não fará conversões “representação-substituição” de short para int nullable como o operador cast faria. Similarmente, se você tem uma classe Alpha e uma outra classe não relacionada Bravo, com uma conversão de Bravo para Alpha, então “(Alpha) bravo” será convertido, mas “bravo as Alpha” não. O operador “as” apenas considera conversões de referência, boxing e unboxing.

E finalmente, é claro que o uso dos dois operadores são superficialmente similares, mas semanticamente completamente diferentes. O cast comunica para o leitor “Eu estou certo que esta conversão é legal e eu concordo em receber uma exceção se eu estiver errado”. O operador “as” comunica “Eu não sei se esta conversão é legal ou não; nós vamos tentar e ver o que acontece”.

Esse texto é uma tradução do post original que Eric Lippert, engenheiro de software da Microsoft, publicou no seu blog Fabulous Adventures In Coding. A versão original você pode ler aqui.

Observação: Essa é minha primeira experiência em tradução de artigos técnicos. Seu comentário expressando sua opinião a respeito é muito bem vinda.

.NET , , , , , ,

Serialização de objetos em JSON com .NET

23, outubro, 2009

Serializar e deserializar instâncias de objetos no formato JSON com .NET acaba sendo muito simples.

Esse é o Jason, não JSON.

Vamos utilizar como exemplo a classe abaixo:

public class SomeFakeClass
{
    public int ID { get; set; }

    public string Text { get; set; }

    public decimal Value { get; set; }
}

E criamos uma instância dela:

SomeFakeClass fake = new SomeFakeClass
{
    ID = 123,
    Text = "I am a sample text.",
    Value = 150.85M
};

Então queremos serializar a variável fake em JSON para obter o seguinte resultado:
{"ID":123,"Text":"I am a sample text.","Value":150.85}

A classe DataContractJsonSerializer torna essa tarefa muito fácil. Basta escrever os dados serializados para um Stream usando o método WriteObject e depois recuperar uma string a partir desse Stream:

MemoryStream stream = new MemoryStream();

DataContractJsonSerializer serializer;
serializer = new DataContractJsonSerializer(typeof(SomeFakeClass));
serializer.WriteObject(stream, fake);

string json = return Encoding.Default.GetString(stream.ToArray());

Para fazer o inverso, transformar dados em JSON para um objeto, usamos o método ReadObject passando o Stream que possui os dados serializados:

string json = "{"ID":123,"Text":"I am a sample text.","Value":150.85}";

MemoryStream stream = new MemoryStream(json);

DataContractJsonSerializer serializer;
serializer = new DataContractJsonSerializer(typeof(SomeFakeClass));

SomeFakeClass fake = (SomeFakeClass)serializer.ReadObject(stream);

Um detalhe importante é que a partir do .NET Framework 3.5 Service Pack 1 não há mais a necessidade de decorar a classe que queremos serializar com os atributos DataContract e DataMember, como o exemplo abaixo:

[DataContract]
public class SomeFakeClass
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Text { get; set; }

    [DataMember]
    public decimal Value { get; set; }
}

Isso somente se faz necessário se quisermos ter uma controle maior do que será serializado, como por exemplo, serializar uma propriedade com um nome diferente. Na classe abaixo, a propriedade Text é configurada para ser serializada com o nome Message:

[DataContract]
public class SomeFakeClass
{
    [DataMember]
    public int ID { get; set; }

    [DataMember(Name = "Message")]
    public string Text { get; set; }

    [DataMember]
    public decimal Value { get; set; }
}

Os dados serializados em JSON podem ser algo como:
{"ID":123,"Message":"I am a sample text.","Value":150.85}

Para usar a classe DataContractJsonSerializer, que está no namespace System.Runtime.Serialization.Json, é necessário adicionar referências para dois assemblies no seu projeto:

  • System.Runtime.Serialization
  • System.ServiceModel.Web

Agora que já sabemos como serializar e deserializar em JSON, podemos criar um utilitário que faz esse trabalho. O exemplo abaixo utiliza Extensions Methods combinados com Generics:

public static class JsonSerializerExtensions
{
    public static string ToJson<T>(this T obj)
    {
        MemoryStream stream;

        using (stream = new MemoryStream())
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            serializer.WriteObject(stream, obj);
        }

        return Encoding.Default.GetString(stream.ToArray());
    }

    public static T FromJson<T>(this string json)
    {
        T obj;

        using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json)))
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            obj = (T)serializer.ReadObject(stream);
        }

        return obj;
    }
}

E um exemplo de sua utilização:

SomeFakeClass fake = new SomeFakeClass
{
    ID = 123,
    Text = "I am a sample text.",
    Value = 150.85M
};

string fakeJson = fake.ToJson();

SomeFakeClass otherFake = fakeJson.FromJson<SomeFakeClass>();

.
O código-fonte desse utilitário você pode baixar aqui.

.NET , , ,

MSDN Magazine: revista grátis sobre .NET

5, setembro, 2009

Desde que comecei a desenvolver em .NET sempre gostei de ler alguma revista a respeito. Atualmente assino a revista Mundo .NET, mas antigamente eu assinava a .NET Magazine, que na época era MSDN Magazine Brasil. Quando ela deixou de ser MSDN Magazine Brasil para virar .NET Magazine, houve uma grande mudança editoral e na minha opinião o seu conteúdo deixou a desejar.

Por conta disso, procurei pela MSDN Magazine original e, para minha surpresa e felicidade, descobri que sua versão online é totalmente gratuita. A qualidade e diversidade dos artigos são muita boas e entre os autores estão nomes importantes como Dino EspositoJeremy MillerJohn Papa.

A versão online também está disponível em português, mas recomendo verozmente que você fique longe dela, pois a mesma é feita através de um tradutor automático. As primeiras edições disponibilizadas em português eram traduzidas por humanos, então até pode ser que você encontre algum artigo antigo em português que não contenha nenhum absurdo de tradução.

Na verdade, agora estou realmente pensando em não mais assinar a Mundo .NET e acompanhar somente a MSDN Magazine, pois de algumas edições para cá o conteúdo da Mundo .NET tem me decepcionado.

Em resumo, a MSDN Magazine é uma revista americana, mantida pela própria Microsoft, de publicação mensal, com versão impressa paga e versão online grátis.

Você pode acessá-la utilizando o endereço abaixo:
http://msdn.microsoft.com/en-us/magazine/default.aspx

.NET , , , ,

Prometric oferece até 25% de desconto em exames Microsoft

5, setembro, 2009

A Prometric está com uma promoção onde você pode obter 15%, 20% ou 25% de desconto ao se registrar para um exame de certificação Microsoft.

Para participar da promoção “Take control of your career”, basta acessar a página da promoção, escolher um dos exames com desconto e se registrar no mesmo. Entre as opções, há exames de certificação em .NET, SQL Server e Windows.

A promoção é válida para exames agendados até 31 de dezembro de 2009.

Para mais informações e participar da promoção, acesse o link abaixo:
http://www.prometric.com/microsoft/careeroffer.htm

.NET , , , , , , , ,

Cheeseburgers, Decorators e Mocks

29, julho, 2009

Em São Paulo, eu sempre comi cheeseburgers feitos com pão, hamburguer e queijo. Mas quando eu fui para Itararé, cidade do interior do estado de São Paulo, descobri que eles também colocavam milho no sanduíche.

Para exemplificar, vamos imaginar que o cheeseburger de Ilhéus-BA, venha com molho de pimenta. Só para constar, eu nunca fui para Ilhéus, apesar de ser a cidade natal de meu pai. Então na verdade não tenho a mínima idéia de como seja o cheeseburger de lá.

Imagem original de MarketFare Foods, Inc.

Imagem original de MarketFare Foods, Inc.

Vamos transportar esses três tipos de cheeseburgers para objetos e fazer alguns testes com eles. Usarei como plataforma .NET, linguagem C#, a ferramenta de testes unitários que vem com o Visual Studio 2008 e o Rhino Mocks como framework de criação de mocks.

Leia mais…

.NET, Arquitetura , , , , , , , , , , , , ,