none
Visual Web part - Assembly deployment target = Web application RRS feed

  • Pergunta

  • Hi everyone,

    It's possible set a Visual Web Part solution the option "Assembly deployment target" to "Web Application"? I did but I received a security error:

    "System.Security.SecurityException was unhandled by user code

      Message=Request for the permission of type 'Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' failed.
      Source=Microsoft.SharePoint
      StackTrace:
           at Microsoft.SharePoint.ApplicationRuntime.SPVirtualPathProvider.GetCacheKey(String virtualPath)
           at Microsoft.SharePoint.Publishing.Internal.CmsVirtualPathProvider.GetCacheKey(String virtualPath)
           at System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP)
           at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
           at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
           at System.Web.UI.TemplateControl.LoadControl(VirtualPath virtualPath)
           at *************************.CreateChildControls()
           at System.Web.UI.Control.EnsureChildControls()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      InnerException: "


    Anybody can help me?



    Regards,

    Pablo

    quinta-feira, 18 de outubro de 2012 21:01

Respostas

  • Olá,

    Consegui resolver:

    Para criar uma Visual Web Part Farm solution no contexto Web Application:

    - Criar uma solução vazia FARM e adicionar uma "Visual Web part (Sandboxed)" utilizando o modelo do plugin do visual studio 2010 "Visual Power Tools".

    - Adicionar no Package.Template.xml:

    <CodeAccessSecurity>
      <PolicyItem>
        <PermissionSet class="NamedPermissionSet" version="1">
          <IPermission class="SecurityPermission" version="1" Flags="Execution" />
          <IPermission class="AspNetHostingPermission" version="1" Level="Minimal" />
          <IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="True" Impersonate="true" />
        </PermissionSet>
        <Assemblies>
          <Assembly Name="$SharePoint.Project.AssemblyName$" Version="$SharePoint.Project.AssemblyVersion$" PublicKeyBlob="$SharePoint.Project.AssemblyPublicKeyBlob$"/>
        </Assemblies>
      </PolicyItem>
    </CodeAccessSecurity>

    Se estiver utilizando o"RunWithElevatedPrivileges" adicionar na tag IPermission o atributo 'Impersonate=true".

    Fonte: http://blog.mastykarz.nl/code-access-security-policy-template-visual-studio-2010-sharepoint-developer-tools/

    • Marcado como Resposta pablolima.info quinta-feira, 25 de outubro de 2012 17:35
    quinta-feira, 25 de outubro de 2012 17:35

Todas as Respostas

  • Pablo,

    Poderia explicar o que vc pretende fazer?


    Atenciosamente,

    Fabian André Gehrke
    MCITP e MCPD SharePoint 2010
    http://fabiangehrke.com.br

    sexta-feira, 19 de outubro de 2012 12:30
    Moderador
  • Oi Fabian,

    A ideia é tentar contornar o incoveniente ao implantar soluções do tipo Farm que ao implantar a dll no GAC todos os Web applications são reciclados, e tem aplicações que não podem parar. Para tentar amenizar isso eu estava tentando definir a propriedade "Assembly deployment target" para "Web application". Assim só iria derrubar um Web application ao invés de todos. Mas ao mudar esta propriedade em uma Visual Webpart deu o erro que citei acima...

    Obs: A solução utilizar objetos que não são suportados em soluções Sandboxed.

    sexta-feira, 19 de outubro de 2012 12:58
  • Pablo,

    Ao alterar para web application você está informando que a sua dll será copiada para o diretório bin da aplicação ao invés do GAC. Provavelmente você terá que fazer configurações extras para funcionar.

    Mas a pergunta é, porque você não faz esse deploy em horário agendado com impacto reduzido?


    Atenciosamente,

    Fabian André Gehrke
    MCITP e MCPD SharePoint 2010
    http://fabiangehrke.com.br

    sexta-feira, 19 de outubro de 2012 13:09
    Moderador
  • Exatamente, eu cheguei a fazer as configurações de permission set indicadas neste link http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2009/11/20/deploying-a-web-part-with-code-access-security-in-visual-studio-2010-sp2010.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+CoreysDotNetTipOfTheDay+%28Corey+Roth+-+DotNetMafia.com%29  e o erro mudou para este:

    "Request failed.

    System.Security.SecurityException was unhandled by user code
      Message=Request failed.
      Source=mscorlib
      StackTrace:
           at System.Reflection.MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags)
           at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
           at System.Activator.CreateInstance(Type type, Boolean nonPublic)
           at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
           at System.Web.Configuration.PagesSection.CreateControlTypeFilter()
           at System.Web.UI.TemplateParser.ProcessConfigSettings()
           at System.Web.UI.TemplateControlParser.ProcessConfigSettings()
           at System.Web.UI.UserControlParser.ProcessConfigSettings()
           at System.Web.UI.TemplateParser.PrepareParse()
           at System.Web.UI.TemplateParser.Parse()
           at System.Web.Compilation.BaseTemplateBuildProvider.get_CodeCompilerType()
           at System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)
           at System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()
           at System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
           at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
           at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
           at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
           at System.Web.UI.TemplateControl.LoadControl(VirtualPath virtualPath)
           at *************************************************************.CreateChildControls()
           at System.Web.UI.Control.EnsureChildControls()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Control.PreRenderRecursiveInternal()
           at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      InnerException:
    "

    Tentei também fazer esta configuração na classe, adicionando:

    [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]

    E também não funcionou... não sei se no caso específico das Visual Webparts não funciona... sei que este tipo de deploy não é compatível com os Event Receivers. Mas no caso das webparts visuais não achei nenhuma documentação oficial informando isso...

    Sobre agendar um horário para deploy é o que nós fazemos, mas o processo é muito burocrático e demorado, por isso estamos estudando uma forma menos impactante.

    sexta-feira, 19 de outubro de 2012 13:25
  • Olá,

    Consegui resolver:

    Para criar uma Visual Web Part Farm solution no contexto Web Application:

    - Criar uma solução vazia FARM e adicionar uma "Visual Web part (Sandboxed)" utilizando o modelo do plugin do visual studio 2010 "Visual Power Tools".

    - Adicionar no Package.Template.xml:

    <CodeAccessSecurity>
      <PolicyItem>
        <PermissionSet class="NamedPermissionSet" version="1">
          <IPermission class="SecurityPermission" version="1" Flags="Execution" />
          <IPermission class="AspNetHostingPermission" version="1" Level="Minimal" />
          <IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="True" Impersonate="true" />
        </PermissionSet>
        <Assemblies>
          <Assembly Name="$SharePoint.Project.AssemblyName$" Version="$SharePoint.Project.AssemblyVersion$" PublicKeyBlob="$SharePoint.Project.AssemblyPublicKeyBlob$"/>
        </Assemblies>
      </PolicyItem>
    </CodeAccessSecurity>

    Se estiver utilizando o"RunWithElevatedPrivileges" adicionar na tag IPermission o atributo 'Impersonate=true".

    Fonte: http://blog.mastykarz.nl/code-access-security-policy-template-visual-studio-2010-sharepoint-developer-tools/

    • Marcado como Resposta pablolima.info quinta-feira, 25 de outubro de 2012 17:35
    quinta-feira, 25 de outubro de 2012 17:35