Como fazer download de uma página, via HTTPWebRequest, que exija certificado Digital (SSL / HTTPS)


Olá Pessoal,

Tive a necessidade de baixar fotos e documentos de uma página de internet protegido por certificado digital. Eu possuo o Certificado de Cliente necessário, mas não sabia como fazer o download.



Vejo o código abaixo empacotado num extension method:

public static byte[] DownloadData(this System.Net.WebClient w, string url, X509CertificateCollection clientCertificates)
{
WebRequest req = WebRequest.Create(url);
req.PreAuthenticate = true;
req.UseDefaultCredentials = true;

HttpWebRequest reqWeb = (HttpWebRequest)WebRequest.Create(url);
reqWeb.ClientCertificates = clientCertificates;
reqWeb.PreAuthenticate = true;
WebResponse response = reqWeb.GetResponse();

using (BinaryReader br = new BinaryReader(response.GetResponseStream()))
{
   int buffer = 1024;
   int read;
   List<byte> donwloadedFile = new List<byte>();
   byte[] byteArray = new byte[buffer];
   do

   {
      read = br.Read(byteArray, 0, buffer);
      for (int i = 0; i < read; i++)
      {
         donwloadedFile.Add(byteArray[i]);
      }
   } while (read != 0);

   return donwloadedFile.ToArray<byte>();
}

}

O que há de novo no SP 1 - Service Pack 1 - do SharePoint 2010 ?


O SP1 do SharePoint 2010 chegou com algumas novidades interessantes

  • Lixeira para Sites Collections e Sites.
  • Página StorMan.aspx, que oferece uma visão sobre as cotas associadas aos sites. Shallow Copy para o Remote Blob Storage, ao invés de Deep Copy
  • Cascading PerformancePoint Services Filters, que oferece a possibilidade de passar um filtro para outro.
  • Suporte ao Google Chrome

Ainda não conheço a fundo. Assim que tiver mais novidades, eu posto no blog.

Onde faço download do Service Pack 1 do SharePoint?
http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?pID=984 



Onde encontro a documentação oficial do Service Pack 1 do SharePoint? 
http://www.microsoft.com/download/en/details.aspx?id=26573



Urgente
Após a instalação do ServicePack 1, instale o HotFix a seguir:
http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2536599

Que tipo não herda de Object, em dotnet?

Como trabalhar com ponteiros em .NET ?

Poucos sabem que é possível trabalhar diretamente com ponteiros em .NET. Outros até sabem, mas evitam mexer. Em geral não é recomendado que se trabalhe em modo inseguro em .NET, que é requisito para trabalhar com ponteiros.
Os ponteiros são especiais e não herdam de Object, sendo assim uma exceção no ambiente comum da CLR. Para trabalhar com ponteiros é necessário utilizar a palavra reservada unsafe para esta ação.

Habilitando o modo inseguro no projeto

Para utilizar de forma insegura é necessário que seja habilitada a opção de uso de código inseguro na aplicação. Clique com o botão direito no projeto que tornar inseguro (Solution Explorer). Vá até a opção Build nas abas laterais a esquerda. Em General, habilite o checkbox com a frase ‘Allow unsafe code’. Consulte a figura a seguir para auxiliar.
Veja uma exemplo de código que utiliza o contexto inseguro:

public static void Main()
{
unsafe
{
            int* i;
            int j = 10;
            i = &j;

            Console.Write(i->ToString());
}
}

Para trabalhar com ponteiros  é necessário o uso de operadores específicos. Repare o código acima que utiliza :  int*,  i=&j, i->ToString(). Estas notações são comuns na linguagem C++, mas são pouco utilizadas em .Net. Estas notações são válidas apenas em contextos inseguros. Veja a seguir uma lista com os operadores utilizados em ponteiros em .NET:

Operador
Função
*
Faz acesso a um ponteiro
-> Utiliza o conteúdo de um ponteiro
[] Acessa o ponteiro como um vetor.
Cuidado! Pode-se fazer acesso a posições de memória que não estão relacionados ao contexto desejado.
& Obtem dados do destino do apontamento de um vetor
++, -- Incrementa ou decrementa um ponteiro
+,  - Realiza uma operação aritmética
==, !=, <, >, <=, >= Compara ponteiros
Stackalloc Aloca memória na stack
fixed statement Define endereço de ponteiro que aponta para destino que não corresponde ao desejado

Os ponteiros dão flexibilidade para o desenvolvedor. Porém esta flexibilidade pode ser muito prejudicial por não ser tratada diretamente pela CLR. Os ponteiros em .Net podem apontar apenas para seus tipos primitivos: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, ou bool; enumerações; qualquer outro tipo de ponteiro; structs que não tenham campos não gerenciados (campos por referência).
Existe um tipo especial para ponteiros que é o void*. A microsoft não recomenda o uso deste tipo. O tipo void* é utilizado para guardar apontamentos sem identificação do tipo de valor destino ou capacidade de tratamento.
Também é possível trabalhar com um ponteiro como se fosse um vetor. Diferentemente dos vetores de alto nível, é possível acessar posições de memória que não correspondam ao vetor em questão, por não ser tratado. No exemplo a seguir, as posições 0 e 1 são impressas na tela, porém, só a posição 0 é conhecida  pela aplicação.

public static void Main()
{
unsafe
{
            int* i;
            int j = 10;
            i = &j;

            Console.Write(i[0] + “\n” + i[1]);
}
}

Como funcionam internamente os Arrays em .NET?
Os arrays são estruturas de dados fundamentais para a maioria da linguagens de programação. Um agrupamento de dados de um mesmo tipo é dimensionado na memória. Os arrays internamente são ponteiros que acessam posições de memória pré-definidos para leitura e escrita de um tipo específico de dado. Veja a seguir as 2 formas de criação de arrays em C#:
public static void Main()
{
int[] meu_array = new int[50];
      meu_array[10] = 30;

      System.Array meu_array2 = new int[50];
      meu_array2.SetValue(30, 10);

      Console.WriteLine(meu_array[10].ToString());
      Console.WriteLine(meu_array2.GetValue(10).ToString());
}
A notação type[] vale para qualquer tipo de dado, seja por valor ou por referência. Esta notação converte internamente o tipo para um tipo System.Array, e desta forma este encapsulamento é guardado na heap.
Repare que a segunda notação não oferece algo como:

this[int index] { get; set; }.

Sendo assim, é mais fácil trabalhar com a notação type[].



Como adicionar webservices como referencia comum ao invés de web reference ou service reference?

Em soluções que envolvam vários projetos no Visual Studio as referencias a serviços podem ficar perdidas. A associação a um service é feita com “Add Web Reference” ou com “Add Service Reference”. Com isto o Visual Studio obtém o WSDL do serviço e gera o código em C#, VB, etc. É fácil atualizar a referência, útil quando está desenvolvendo a aplicação cliente e o WebService.

Existe um alternativa interessante. Com as aplicações WSDL e CSC pode-se utilizar os webservices como referencias comuns no projeto. Isto pode ser útil:
  • É mais fácil estender funcionalidades do WebService no cliente
  • É mais flexível de utilizar a referência entre os projetos

Gerando o DLL a partir do webservice?

Considero um cenário em que o WebService está sendo criado manualmente.
Para criar uma DLL a partir de um webservice, siga os passos:

1. Crie um projeto do tipo WebService

2. Adicione os webmethods que desejar

3. Compile o webservice

4. Abra o prompt de comando do Visual Studio

5. Execute a linha de comando com WSDL
wsdl /language:cs /out:c:\projetos\financeiroservice.cs /namespace:FinanceiroService http://localhost:1974/Service1.asmx?WSDL
6. Execute a linha de comando com CSC
csc /target:library /out:c:\projetos\financeiroservice.dll c:\projetos\financeiroservice.cs

7. Crie outra aplicação cliente

8. Adione uma referencia

9. Selecione a DLL gerada no passo 6

10. Utilize o serviço no cliente

11. Adicione a referencia de System.Web.Services

12. Voilà! Pronto.

Como configurar a Collation da base de dados para o SharePoint 2010?

É recomendável utilizar um database específico para o SharePoint, quando possível. Isto permite um melhor isolamento lógico e gerencial dos vários bancos de dados criados pelo SharePoint.

Que collation utilizar na instalação da base de dados do SharePoint?
Quando se configura a collation de uma database qualquer, se deve utilizar como base nos usuários. Se todos compartilham de um mesmo padrão, como GREEK, então escolha este. Se os usuários estão geograficamente distribuidos, com culturas e conjuntos de caracteres próprios, deve-se utilizar uma collation mais abrangente. Por padrão, a collation do SQL Server 2008 é  SQL_Latin1_General_CP1_CI_AS.

Segundo o KB http://support.microsoft.com/kb/2008668 a base de dados do SharePoint deve seguir as especificações:
  • case-insensitive
  • accent-sensitive
  • Kana-sensitive
  • width-sensitive
Esta especificação é valida para o SharePoint 2007 ou 2010. Na configuração de um novo DataBase, deve-se escolher o SQL_Latin1_General_CP1_CI_AS em compatibilidade retroativa, ou, escolher Latin1_General com as especificações indicadas acima. Isto é necessário para que as tabelas TEMPDB e MASTERDB estejam configuradas de acordo com as necessidades do SharePoint.
Os bancos de dados criados pelo SharePoint devem ser criados automaticamente, já com todas as configurações necessárias.