SharePoint 2010: Como enviar um ficheiro de tamanho de 1 GB utilizando o modelo de objecto de cliente


Sintomas


Quando utiliza o OM de cliente do SharePoint para carregar ficheiros para a biblioteca de documentos do SharePoint 2010, carregamento de ficheiros com mais de 3 MB Falha com o seguinte erro:

O servidor remoto devolveu um erro: (400) pedido incorrecto.

Rastreio da pilha:

System.Net.WebException foi não processada
Mensagem = o servidor remoto devolvido um erro: (400) pedido incorrecto.
 Source=System
StackTrace:
em System.Net.HttpWebRequest.GetResponse()
em Microsoft.SharePoint.Client.SPWebRequestExecutor.Execute()
em Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer (ChunkStringBuilder sb)
em Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery()
em Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery()
em Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()
em SPClientOMConsoleApp.Program.Main (cadeia [] args) no C:\SPClientOMConsoleApp\SPClientOMConsoleApp\Program.cs:line 32
em System.AppDomain._nExecuteAssembly (cadeia [] argumentos, a montagem de montagem)
em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
em System.Threading.ExecutionContext.Run (ExecutionContext executionContext, chamada de retorno de ContextCallback, estado do objecto)
em System.Threading.ThreadHelper.ThreadStart()
InnerException:

Programa de exemplo é utilizado para carregar o ficheiro utilizando o cliente OM do SharePoint 2010:

ClientContext clientContext = Novo ClientContext("sites/http://server:10000/testSite");
Web web = clientContext.Web;
clientContext.Load(web);
Lista de biblioteca de documentos = web. Lists.GetByTitle ("biblioteca de documentos");
clientContext.Load(docLib);
clientContext.ExecuteQuery();
byte bInformações de ficheiros [] = System.IO. Ficheiro. ReadAllBytes (@"C:\largeFile.docx");
Ficheiro de FileCreationInformation = Novo FileCreationInformation(-);
ficheiro. Conteúdo = bInformações de ficheiros;
ficheiro. URL = "http://server:10000/sites/testSite/biblioteca de documentos/" + "test.docx";
Microsoft.SharePoint.Client. Ficheiro newFile = docLib.RootFolder.Files.Add(file);
clientContext.Load(newFile);
clientContext.ExecuteQuery();

Requisito:

Como enviar ficheiros com tamanho maior, por exemplo, até 1 GB ou mais, utilizando modelo de objecto de cliente no SharePoint 2010.

Causa


As restrições predefinidas de interno tamanhos de ficheiros e definições de tempo limite paragem carregamento de ficheiros maiores, utilizando o modelo de objecto de cliente no SharePoint.

Resolução


Vamos considerar que é necessário carregar um ficheiro que se aproxime o tamanho máximo de carregamento permitido pela infra-estrutura do SharePoint. Para atingir esse objectivo, necessita de alterar os valores predefinidos relacionados com o ficheiro carregar processo, ou seja, o máximo permitido de ficheiro tamanho no SharePoint 2010, o tamanho máximo da mensagem recebida nas definições do serviço de pedido do cliente para o SharePoint 2010 e o tempo de espera definições especificadas na Web. config da aplicação web do SharePoint. Localize consulte os detalhes abaixo:

Aumento máximo permitido de tamanho do ficheiro para carregar a utilização de bibliotecas do SharePoint 2010 a seguir os passos:

  1. Procurar para o site de Administração Central do SharePoint 2010 -> Gestão de aplicações -> Gerir aplicações Web (< CentralAdminURL > / _admin/WebApplicationList.aspx) -> Seleccione a aplicação de Web onde pretende transferir ficheiros grandes-seleccionar > Definições gerais a partir do menu do Friso.
  2. Uma vez na página "Definições de geral da aplicação Web", desloque-se para baixo para localizar a secção "Tamanho máximo de envio".
  3. Altere o valor "Tamanho máximo do carregamento" para 2047 MB (2 GB é o valor máximo permitido ser estabelecidas na presente secção)
  4. Clique em OK para confirmar e guardar as alterações de definição.

Aumente as definições de tempo limite no ficheiro Web. config da aplicação web:

  1. No computador de servidor do SharePoint 2010, navegue para a pasta "C:\inetpub\wwwroot\wss\VirtualDirectories" e seleccione a pasta de origem, relacionadas com a aplicação web acima.
  2. Esta pasta, deverá localizar o ficheiro Web. config de aplicações.
  3. Abra o ficheiro Web. config num editor de texto como o bloco de notas e localizar o elemento de HTTPRuntime (haverá vários elementos HTTPRuntime deste ficheiro para efectuar alterações).
  4. Configurar agora o maxRequestLength = "2097151" e executionTimeout = "1800000"
  5. Também localizar o elemento de jsonSerialization e defina o valor como "2146435072"
  6. Guarde e feche o ficheiro Web. config.

Aumente as definições de serviço do pedido de cliente para o SharePoint 2010:

Executar a seguir código numa aplicação de consola para aumentar o valor desta definição:

utilizando o Sistema;
utilizando o System.Collections.Generic;
utilizando o System.Text;
utilizando o Microsoft.SharePoint.Client;
utilizando o Microsoft;
utilizando o Microsoft.SharePoint.Administration;
utilizando o System.IO;

espaço de nomes SPClientOMConsoleApp

{
classe Programa
{
estático void Principal (cadeia deargumentos de [])
{
SPWebService ws = SPWebService. ContentService;

SPClientRequestServiceSettings clientSettings = ws. ClientRequestServiceSettings;

clientSettings.MaxReceivedMessageSize = 2146435072;

ws. Update ();

Consola. WriteLine(clientSettings.MaxReceivedMessageSize);

}
}
}

Agora que aumentámos os valores das definições, podemos utilizar as opções de dois códigos especificadas abaixo, para carregar os ficheiros de maiores dimensões utilizando o modelo de objecto de cliente do SharePoint 2010:

Opção 1:

Tal como acima referido, utilize a API Microsoft.SharePoint.Administration.SPClientRequestServiceSettings para definir o MaxReceivedMessageSize para valores mais elevados, por exemplo, 2 GB. Note que o valor da propriedade MaxReceivedMessageSize tem de ser definida apenas uma vez e não necessita de ser executado sempre que o cliente OM com código de carregamento do ficheiro base é accionado:

(Garantir que esta opção funciona definir as propriedades do projecto para utilizar o .NET Framework 3.5 e plataforma de destino como "Any CPU")

utilizando o Sistema;
utilizando o System.Collections.Generic;
utilizando o System.Linq;
utilizando o System.Text;
utilizando o Microsoft.SharePoint.Client;
utilizando o System.IO;

espaço de nomes SPClientOMConsoleApp
{
classe Programa
{
estático void Principal (cadeia deargumentos de [])
{
ClientContext clientContext = Novo ClientContext("sites/http://server:10000/testSite");
Web web = clientContext.Web;
clientContext.Load(web);
Lista de biblioteca de documentos = web. Lists.GetByTitle ("biblioteca de documentos");
clientContext.Load(docLib);
clientContext.ExecuteQuery();  

byte bInformações de ficheiros [] = System.IO. Ficheiro. ReadAllBytes (@"C:\largeFile.docx");
Ficheiro de FileCreationInformation = Novo FileCreationInformation(-);
ficheiro. Conteúdo = bInformações de ficheiros;
ficheiro. URL = "http://server:10000/sites/testSite/biblioteca de documentos/" + "test.docx";
Microsoft.SharePoint.Client. Ficheiro newFile = docLib.RootFolder.Files.Add(file);
clientContext.Load(newFile);
clientContext.ExecuteQuery();
}
}
}

Opção 2:

Utilizando HTTP DAV podemos enviar os dados binários não processados através da ligação e não é necessário aumentar o tamanho da mensagem recebida.  Este é o método de envio preferencial quando utilizar o modelo de objecto de cliente gerido.

utilizando o Sistema;
utilizando o System.Collections.Generic;
utilizando o System.Linq;
utilizando o System.Text;
utilizando o Microsoft.SharePoint.Client;
utilizando o System.IO;

espaço de nomes SPClientOMConsoleApp
{
classe Programa
{
estático void Principal (cadeia deargumentos de [])
{
Contexto de ClientContext = Novo ClientContext("sites/http://server:10000/testSite");
utilizando o (FileStream fs = Novo FileStream(@"C:\largeFile.docx", FileMode. Abrir))
{
Microsoft.SharePoint.Client. Ficheiro. SaveBinaryDirect (contexto, "/ sites/testSite/doclib/test.docx", fs, Verdadeiro);
}
}
}
}

Ambas as opções acima foram testadas para um envio com êxito de um ficheiro de tamanhos de 1 GB. Para valores mais elevados (diga um tamanho do ficheiro de 1,8 GB), utilize a opção 2 (HTTP DAV) mostrado acima.

Mais informações


Por vezes poderá ver que a operação de carregamento devolve uma excepção de tempo limite, mas esta operação é crítica apenas para tamanhos de ficheiros muito grandes que são semelhantes a 2 GB. Caso contrário, pode ser ignorado utilizando um bloco try-catch e deverá ver que o ficheiro foi carregado com êxito.