Category Archives: Desenvolvimento do SharePoint

Bambu calendário interagindo com o SharePoint faz com que "Ocorreu um erro inesperado"

Hoje, Tenho trabalhado em um ambiente que usa uma web part de calendário de bambu para alguma colaboração melhorada. Isto um padrão médio/pequeno farm com dois servidores Web de balanceamento de carga, um "servidor de aplicativo" para indexação e InfoPath e um cluster SQL back-end.

O cliente instalado algum software de recuperação de desastre em um dos servidores da Web e que resultou em um WFE quebrado para um local específico na coleção de site. Sempre que o balanceamento de carga apontada para os afetados WFE e esse site, os usuários viram uma tela branca em grande parte em branco com a frase "ocorreu um erro inesperado". Nenhuma outra informação mostrou, só que a sentença.

Pediram-me para olhar para ele. Eu facilmente reproduzido o problema e então adicionado um ?Sumário = 1 ao final da URL. Isto é como eu aprendi que eles estavam usando a web part de bambu. Voltei para a página e agora, de repente, Ele mostrou-me uma mensagem de erro ordenada bonito:

image

Não sei o que estava acontecendo ou o que eu fiz para obter a mensagem de erro controlada para exibir que acrescentando o ?Sumário = 1 bit da seqüência de caracteres de consulta.

Este é provavelmente um caso muito raro de borda mas se você receber essa mensagem, "Ocorreu um erro inesperado" vá em frente e adicione ?Sumário = 1 a seqüência de caracteres de consulta e ver onde que leva.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Technorati Tags: ,

Usando o Reflector do Microsoft.SharePoint.dll

Redgate .NET Reflector Michael Blumenthal tem colocado um artigo sobre alertas e modos de exibição ("Os modos de exibição podem ser usados ao criar um alerta ?"), o que é interessante por seus próprios méritos. No entanto, Fiquei ainda mais interessado em ver como ele metodicamente percorre o processo de utilização .NET Reflector do Redgate. Passo a passo, Ele mostra como usar esse caminho de ferramenta para baixo como o SharePoint determina se um modo de exibição em uma lista deve ser "subscribable" por falta de uma palavra melhor (he explains this much better than I do 🙂 ).

Neste momento na era do SharePoint, Você quase teria que ser surdo e cego para não ter ouvido ou lido sobre como usar essa ferramenta. Avançou coisas e meu sentido é que é em muitos aspectos, uma ferramenta de último recurso. No entanto, Se você pensar você precisa dele, mas realmente não sei como, Escrever-se de Michael parece ser um ótimo tutorial sobre este assunto.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Classificação dos itens de calendário no modo de exibição calendário

Eu estou usando um calendário para localizar painéis de discussão num determinado dia. Eu tenho duas sessões: manhã e tarde. Eu quero criar uma exibição que mostra as sessões da manhã só listadas em ordem alfabética, através de um ID de sessão. Isto é um pouco complicado para realizar (a menos que eu perdi alguma coisa real óbvio).

Eu posso facilmente criar uma exibição filtrada, mostrando apenas que os eventos de hoje. O calendário irá mostrar todos os eventos e se todos eles se coloque na mesma hora, ele enumera-los lado a lado no slot da hora. Fantástico. A parte complicada é que, Por padrão, Quer listá-las no formato de ID. Assim, Se eu adicionar "sessão 02" e então "sessão 01" no calendário, mostra-los nessa ordem (ou seja, Sessão 02 e depois de sessão 01). Para listá-los em ordem de ID de sessão, Pensei experimentar essas coisas:

  1. Configurar o modo de exibição usando a interface de usuário web. Sem sorte. Não há nenhuma opção para classificar itens desta forma.

    Desde que isso não funcionou, Estou agora esperando lá é uma consulta CAML algures por aí que me permitirá substituir o tipo. CQWP permite-me fazer isso tipo de mudar, Talvez o calendário será também?

  2. Editar a web part, Procure uma exportação"" função e … BZZZT! Eu não posso exportar seu XML. Não há nenhuma opção de exportação.

    Ainda tenho esperança que posso encontrar e modificar alguma consulta CAML. Desde que eu não é possível exportar a web part, Isso deixa o SharePoint Designer.

  3. Para adicionar a web part de calendário para um site seguro e abrir esse site usando o SharePoint Designer. Olho para a marcação para a web part e encontrar o que procuro. Ele tem codificados loucura, Mas está lá: "<ListViewXml …. >loucura codificada</ListViewXml>". Especificamente, Há esta jóia:

<Consulta>
<Onde>
<DateRangesOverlap>
<FieldRef nome = "Count" />
<FieldRef nome = "EndDate" />
<FieldRef nome = "RecurrenceID" />
<Tipo de valor = "DateTime">
<Mês />
</Valor>
</DateRangesOverlap>
</Onde>
<OrderBy><FieldRef nome = "Session_x0020_ID" /></OrderBy>
</Consulta>

(Já decodifiquei o &lt;do e &do gt e separá-los para fora para várias linhas para de clareza).

Adicionar o <OrderBy> um pouco e agora ele classifica por ID de sessão, Não o ID do item de lista interna.

O gigantesco de ponta’ o chapéu de Becky Isserman pelo seu comentário ao post do blog de Isha Sagi: http://www.sharepoint-tips.com/2008/07/caml-sorting-by-file-name.html. Não colocaria o <OrderBy> no lugar certo sem seu comentário.

Espero que ao escrever isto mais claramente com capturas de tela em breve, Mas no caso de não fazer, pelo menos eu fiz assim.

</fim>

Recursos do SharePoint & Gerenciamento de soluções — Não se esqueça do u no CRUD (ou d para que o assunto)

Colectivamente despendemos muito tempo pensando sobre as soluções SharePoint — como criá-los, qual ferramenta usar, o que acontece quando eles não conseguem implantar, trabalhos de timer, escopos, etc. Passamos tanto tempo pensando sobre os up-front bits que é fácil esquecer que é preciso recolhê-los também. Soluções de retracção é provavelmente mais difícil, da perspectiva do design conceitual, do que implantá-los. Implantação é basicamente um assunto de livro de receitas. Normalmente, instalar um recurso, Talvez tenha um receptor de recursos carregar alguns dados em uma lista, Esse tipo de coisa. No entanto, retracção é potencialmente mais complexa.

Uma determinada solução pode criar artefatos como estes:

  • Tipo de conteúdo
  • Definição de lista
  • Definição de site
  • Dados em uma lista
  • Mesmo os receptores
  • Formulários do InfoPath

A lista continua.

Enquanto é obviamente importante projetar uma solução que instancia os artefatos corretamente, é tão importante considerar a atualização e excluir casos. Se sua solução cria uma nova lista e preenche a lista com dados, o que acontece quando a solução está retraída? Em alguns casos, a lista deve ser excluída.. Em outros casos, deve ser deixado intacto para fins históricos. Seus requisitos de negócios irão guiá-lo para a decisão certa.

Para ajudar com isso, criar uma matriz que relaciona cada artefato que sua solução implanta para SharePoint. Lista três colunas por artefato, um para criar, Update e delete. Para cada caso, determinar o resultado correto para que a operação.

Este tipo de análise é obviamente melhor feito antes que a solução já é implantada em um farm do SharePoint. No entanto, como fumar, Nunca é demasiado tarde para começar a fazer as coisas corretamente. Que a matriz de criar e desenvolver um plano para abordar os cenários de atualização/exclusão faltando. Pode ser um problema difícil de resolver, Mas pelo menos você vai ter colocar uma caixa em torno do problema.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Correção rápida: Serviços que interagir com o SharePoint Web, InvalidOperationException

1 Milhão de anos atrás, Eu ajudei desenvolveu um serviço web que foi invocado através de uma ação personalizada para um fluxo de trabalho do SharePoint Designer. Nesta semana, o cliente queria movê-lo para produção (Finalmente!) Então nós fizemos.

A ação personalizada que funcionou bem, Mas não fez o serviço da web que é chamado, nos dando esse erro:

System. InvalidOperationException: Esta operação pode ser executada apenas em um computador que é parte de um farm de servidores por usuários que têm permissões no SQL Server para ler do banco de dados de configuração. Para se conectar a este servidor ao farm de servidores, Use o assistente de configuração de tecnologias e produtos SharePoint, localizado no menu Iniciar, em ferramentas administrativas.
em Microsoft.SharePoint.Administration.SPWebApplication.Lookup(URI requestUri)

Acontece que eu esqueci de adicionar o serviço para o pool de aplicativos do SharePoint no IIS. Uma vez eu fiz isso, funcionou muito bem.

Nesta postagem de fórum MSDN me deu a pista que eu precisava: http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/2c97c004-7118-4e06-a62c-b2b0ac07ac99

</fim>

Subscreva ao meu blog.

Siga-me no twitter: http://twitter.com/pagalvin

Technorati Tags:

Rápido e fácil: Obter SPFolder de SPItemList

Manter deparando com este problema e o Google nunca parece entender o que eu quero fazer, então eu percebi que eu ia escrever isso para baixo.

Tenho vindo a fazer um monte de receptor de eventos de depuração na última semana ou duas. A ER é definido em relação a uma biblioteca de documentos. Os itens individuais na biblioteca de documento relacionam-se firmemente para suas pastas pai. Assim, Estou sempre recebendo a pasta do item para várias manipulações. Durante a depuração, Eu precisava para atualizar os metadados de uma pasta para um item específico cujo ID eu sei.

Aqui é um pequeno aplicativo de console (projetado para ser executado no servidor do farm) que leva dois argumentos: o ID de um item e um valor para atribuir a um campo, "Status de aprovação". É difícil códigos um monte de coisas e não tem nenhuma verificação de erros.

O código é um site codificado, Obtém uma biblioteca de documento codificado e depois encontra o item indicado. Em seguida, localiza a pasta pai desse item e atribui o valor de status.

A lição fundamental aqui para mim é que SPItem não você terá acesso à pasta. Você precisa usar SPListItem.

Se ninguém se preocupa em oferecer uma crítica ou sugerir uma forma melhor de obter a pasta de um item, por favor, deixe um comentário.

<código>
usando Sistema;
usando System.Collections.Generic;
usando System. Text;
usando Microsoft. SharePoint;
usando System. Collections;

espaço para nome Conchango
{
    /// <Resumo>
 /// </Resumo>
 Classe ManualFolderUpdate
    {
        estático privatevoid Principal(Cadeia de caracteres[] args)
        {
            Cadeia de caracteres MSH = "ManualFolderUpdate (v 1.0): "; // msh = "cabeçalho da mensagem"

 Console.WriteLine(MSH + "Arranque.  Foi modificado em 04/08/08.");

            Cadeia de caracteres URL = http://localhost/xyzzy;

            usando (SPSite t: Microsoft.SharePoint.SPSite oSPSite = Novo SPSite t: Microsoft.SharePoint.SPSite(URL))
            {

                usando (SPWeb oSPWeb = oSPSite.OpenWeb())
                {
                    SPList t: Microsoft.SharePoint.SPList docLib = oSPWeb.Lists["Documentos"];

                    Console.WriteLine(MSH + "Tenho a biblioteca de documentos.");

                    Console.WriteLine(MSH + "Doc lib contagem de itens: [" + docLib.ItemCount + "].");

                    int FolderID = 0;
                    Cadeia de caracteres NewStatus = "xyzzy";

                    FolderID = sistema.Converter.ToInt32(args[0].ToString());
                    Console.WriteLine("Buscando pasta item: [" + FolderID + "].");

                    SPListItem Li = docLib.GetItemById(FolderID);

                    SPFolder thisItemFolder = li.File.ParentFolder;

                    Console.WriteLine(MSH + "Tenho a pasta pai.");

                    NewStatus = args[1].ToString();
                    Console.WriteLine("Status da configuração de [" + NewStatus + "].");

                    Console.WriteLine("Pressione ENTER para confirmar a atualização ou o CTRL-C para abortar.");

                    Console.ReadLine();

                    thisItemFolder.Item["O Status de aprovação"] = NewStatus;
                    thisItemFolder.Item.Update();

                    Console.WriteLine(MSH + "Terminar de atualizar a pasta.  Sair.");

                } // using SPWeb

            } // using SPSite

 Console.WriteLine(MSH + "Terminou.");

        } // Principal

    } // Classe foldersync
} // espaço para nome
</código>

</fim>

Subscreva ao meu blog.

Esconder ações personalizadas no SharePoint

Há vários meses., enquanto trabalhava em um projeto para um cliente, Eu criei um recurso. Entre outras coisas, Essa característica definida uma ação personalizada (Estes aparecem em configurações do site). A finalidade única de ação personalizada foi demonstrar que a ativação do recurso estava funcionando conforme o esperado. Basicamente, Usei-o como uma forma bruta de depuração.

Muito para minha vergonha, Este artefato depuração fez o seu caminho de dev UAT e produção antes que alguém precisa perguntar, "o que é este link xyzzy?"

Por agora, Estamos em produção e eu realmente não quero desinstalar o recurso, corrigir o Elements e reinstale.

Todd mais sombrio apontou uma maneira fácil de lidar com isso. Em suas palavras:

"CustomActions não são copiados para o banco de dados, Eles são lidos diretamente do arquivo elements. xml e copiados para o estado do aplicativo em tempo de execução. Assim, Você não precisa desativar, desinstalar, reinstalar, e reativar o recurso para remover o CustomAction. Basta removê-lo do arquivo elements. xml e reciclar o pool de aplicativos(s) efetuado. Da próxima vez que o recurso está no escopo, Você não verá mais o CustomAction."

Eu segui suas instruções e, É claro, Eles trabalham.

No meu caso, Esta é uma instalação de nível de departamento com apenas um único WFE. Se você encontrar-se com este problema no futuro e do múltiplas WFE, Eu acredito que você vai ter que fazer a mudança em cada.

</fim>

Subscreva ao meu blog.

Correção rápida: Acessar o Site do SharePoint lança [HttpException (0x 80004005): Solicitação expirou.]

Um dos meus colegas de desenvolvedor estava trabalhando em um projeto esta semana e teve um problema de timeout enquanto trabalhava na construção de alguma parte louca da web. Sua parte da web estava bem, Mas "de repente" um site independente tornou-se muito lento e frequentemente esgotado com esse erro:

[HttpException (0x 80004005): Solicitação expirou.]

Eu logado e vi que vários outros sites eram bem. Eu suspeitava que havia algumas partes da web escondida na página e usando o fiel ?Sumário = 1 técnica de depuração, Na verdade encontrei 11 Web parts em uma página, apenas dois dos quais eram visíveis. Melhor ainda (de uma perspectiva let's-hope-I-find-something-ugly-here-that-I-can-fix), três das peças web fechada tinham um nome de "Erro".

Eu deletei as web parts (que por sua vez levou um tempo surpreendentemente longo) e isso resolveu o problema. Para hoje 🙂

</fim>

Subscreva ao meu blog.

Technorati Tags:

Invocando SSRS Web Services do WSS / MUSGO no ambiente FBA

Precisávamos invocar o CreateSubscription"" método em um serviço de web SSRS que está hospedado em um FBA gerenciado ambiente MOSS de uma personalizado web part. Estamos ficando variações de:

  • 401: Não autorizado
  • Objeto movido

O "objeto movido" mensagem era mais interessante, porque ele estava dizendo que o objeto"" (nosso serviço do SSRS) "mudou-se" para login. aspx. Isto foi claramente que tivemos algum tipo de problema de autenticação.

Eventualmente percebi que eu tinha... marcada uma entrada de blog por Robert Garret, que descreveu como chamar um serviço de web do WSS/MOSS de propósito geral vivendo dentro de um ambiente de FBA. Note que eu não posso ligar diretamente para o artigo (a partir de 06/09/08) Porque ele quer autenticar. O link que forneço traz a uma "todas as mensagens" Vista e você pode localizar o artigo específico procurando por "Acessando MOSS Web Services usando a autenticação de formulários com base".

Aqui está o código que trabalhou para nós:

ReportingService2006 rs = nulo; 
// Autenticar Autenticação auth = Novo Autenticação(); 
auth.URL = "http://URL/_vti_bin/Authentication.asmx";
auth.CookieContainer =
Novo CookieContainer();
LoginResult resultado = autenticação.Login("userid", "senha");
se (resultado.ErrorCode = = LoginErrorCode.NoError) 
{
// Nenhum erro, Então, pegar os biscoitos.
CookieCollection cookies = autenticação.CookieContainer.GetCookies(Novo URI(auth.URL));
Cookie authCookie = cookies[resultado.CookieName];
RS =
Novo ReportingService2006();
RS.URL =
"http://Server/_vti_bin/ReportServer/ReportService2006.asmx";
RS.CookieContainer =
Novo CookieContainer();
RS.CookieContainer(authCookie);
}
Tente
{
  RS.CreateSubscription(relatório, extSettings, DESC, eventType, matchData, parameters1);
}
pegar (Exceção ex)
{
  Console. WriteLine(ex.Message.ToString());
}

Eu interpreto as coisas funcionem assim:

  • Nossa parte de web precisa de dial-up do serviço de autenticação e dizer, "Ei, Tony, Sou eu!".
  • Serviço de autenticação responde dizendo, "Ei, Eu sei que você. Como estão as crianças? Aqui está um token."
  • Chamamos o serviço de SSRS e dizer, "Tony me mandou, aqui é o token."

</fim>

Subscreva ao meu blog.

Rápido e simples: Provisionar um Web Site utilizando o modelo de objeto SharePoint em c#

Eu tentei procurar por um pequeno trecho de código que iria mostrar como pode criar um novo SPWeb t: Microsoft.SharePoint.SPWeb em um conjunto de sites. Não encontrá-lo como rapidamente ou facilmente, como eu esperava, então eu pensei que eu daria um tapa juntos uma pequena entrada sobre o assunto.

Esse código cria um novo site Wiki:

 SPSite t: Microsoft.SharePoint.SPSite siteCollection;

    siteCollection = Novo SPSite t: Microsoft.SharePoint.SPSite("http://conchang-o9l8qi");

    SPWeb w = siteCollection.OpenWeb();

    w.Webs.Add("xyzzy", "xyzzy título",
        "xyzzy descrição", 1033, SPWebTemplate.WebTemplateWIKI, falso, falso);

Minhas buscas iniciais falharam porque eu estava procurando por frases como "configurar um web site utilizando o modelo de objeto sharepoint" e afins.

Se você pesquisa para Webs.Add"()", Você encontrará um número de entradas de blog muito útil, Artigos da MSDN e a documentação do SDK que entram em profundidade sobre este assunto. Eu definitivamente recomendo Este site.

</fim>

Subscreva ao meu blog.

Technorati Tags: