visual studio started remote not management habilitar for deploy configuring visual-studio-2010 iis-7 msdeploy webdeploy

visual-studio-2010 - started - web deploy visual studio 2017



¿Se puede usar el proveedor setAcl de Web Deploy en un subdirectorio? (2)

Estoy tratando de hacer que un subdirectorio en un paquete de MS Deploy pueda escribirse para el usuario del grupo de aplicaciones. Gracias a una publicación útil sobre el proveedor de setAcl por Kevin Leetham pude obtener la mayor parte de lo que necesito en mi archivo de proyecto:

<MsDeploySourceManifest Include="setAcl" Condition="$(IncludeSetAclProviderOnDestination)"> <Path>$(_MSDeployDirPath_FullPath)/doc/public</Path> <setAclAccess>Read,Write,Modify</setAclAccess> <setAclResourceType>Directory</setAclResourceType> <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings> </MsDeploySourceManifest>

Tenga en cuenta que he agregado "/ doc / public" al directorio de implementación raíz. En el manifiesto resultante que construye VS2010, veo el siguiente elemento setAcl:

<sitemanifest> <contentPath path="C:/Source/.../obj/Debug/Package/PackageTmp" /> <setAcl path="C:/Source/.../obj/Debug/Package/PackageTmp" setAclResourceType="Directory" /> <setAcl path="C:/Source/.../obj/Debug/Package/PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" /> <setAcl path="C:/Source/.../obj/Debug/Package/PackageTmp/doc/public" setAclResourceType="Directory" setAclAccess="Read,Write,Modify" /> </sitemanifest>

La última línea se ve bien: se adjunta al subdirectorio en el que quiero que se pueda escribir, y todos los modificadores de acceso parecen haberse transferido lo suficientemente bien.

Sin embargo, cuando implemento este paquete recibo un error:

Error: se debe especificar un valor para la configuración ''setAclUser'' cuando el proveedor ''setAcl'' se usa con una ruta física.

Este es un error confuso porque no estoy tratando de establecer una ACL en una ruta física, exactamente, sino en un subdirectorio de una aplicación web. En cuanto a la salida de MS Deploy, es fácil ver el problema:

Info: Adding setAcl (REST Services/1.0.334). Info: Adding setAcl (REST Services/1.0.334). Info: Adding setAcl (C:/.../obj/Release/Package/PackageTmp/doc/public).

Aparentemente, MS Deploy está sustituyendo el nombre de la aplicación web por mi ruta absoluta "C: ... / obj / Release / Package / PackageTmp", pero cuando agrego "/ doc / public" a esa ruta absoluta, ya no la reconoce como una Directorio de aplicaciones web. Este problema exacto lo describe otra víctima en los foros de ASP.NET sin ninguna resolución.

¿Alguien sabe cómo configurar una ACL en un subdirectorio particular de una aplicación web a través de Web Deploy sin identificar manualmente la ruta física y el usuario del grupo de aplicaciones en el host de destino?


Bien, primero déjame decirte que esto es mucho más difícil de lo que debería ser.

Creo que la razón por la que está fallando es porque cuando lo publicas no puede reconocer la carpeta como una carpeta en la aplicación IIS. La razón por la que esto sucede es porque la ruta completa se transfiere al destino cuando se invoca al proveedor de SetAcl. En lugar de eso, necesitamos una ruta que sea relativa a la aplicación IIS. Por ejemplo, en su caso, debería ser algo como: "REST SERVICES / 1.0.334 / doc / public". La única forma de hacerlo es crear un parámetro MSDeploy que se rellene con el valor correcto en el momento de la publicación. Tendrá que hacer esto además de crear su propia entrada de SetAcl en el manifiesto de origen. Siga los pasos a continuación.

  1. En el mismo directorio que su proyecto, cree un archivo con el nombre {ProjectName} .wpp.targets (donde {ProjectName} es el nombre de su proyecto de aplicación Web)
  2. Dentro del archivo, pegue el contenido de MSBuild que está debajo de esta lista
  3. Vuelva a cargar el proyecto en Visual Studio (VS almacena en caché los archivos del proyecto en la memoria, por lo que este caché debe borrarse).

{ProjectName} .wpp.targets

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="SetupCustomAcls" AfterTargets="AddIisSettingAndFileContentsToSourceManifest"> <!-- This must be declared inside of a target because the property $(_MSDeployDirPath_FullPath) will not be defined at that time. --> <ItemGroup> <MsDeploySourceManifest Include="setAcl"> <Path>$(_MSDeployDirPath_FullPath)/doc/public</Path> <setAclAccess>Read,Write,Modify</setAclAccess> <setAclResourceType>Directory</setAclResourceType> <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings> </MsDeploySourceManifest> </ItemGroup> </Target> <Target Name="DeclareCustomParameters" AfterTargets="AddIisAndContentDeclareParametersItems"> <!-- This must be declared inside of a target because the property $(_EscapeRegEx_MSDeployDirPath) will not be defined at that time. --> <ItemGroup> <MsDeployDeclareParameters Include="DocPublicSetAclParam"> <Kind>ProviderPath</Kind> <Scope>setAcl</Scope> <Match>^$(_EscapeRegEx_MSDeployDirPath)//doc//public$</Match> <Value>$(_DestinationContentPath)/doc/public</Value> <ExcludeFromSetParameter>True</ExcludeFromSetParameter> </MsDeployDeclareParameters> </ItemGroup> </Target> </Project>

Para explicar esto un poco, el SetupCustomAcls de destino hará que se coloque una nueva entrada de SetAcl dentro del manifiesto de origen utilizado durante la publicación. Este objetivo se ejecuta después de que se ejecuta el destino AddIisSettingAndFileContentsToSourceManifest , a través del atributo AfterTargets. Hacemos esto para asegurarnos de que el valor del elemento se cree en el momento correcto y porque necesitamos asegurarnos de que la propiedad _MSDeployDirPath_FullPath esté completa.

DeclareCustomParameters es donde se creará el parámetro MSDeploy personalizado. Ese destino se ejecutará después del destino AddIisAndContentDeclareParametersItems . Hacemos esto para asegurarnos de que la propiedad _EscapeRegEx_MSDeployDirPath se rellene . Observe dentro de ese objetivo cuando declaro el valor del parámetro (dentro del elemento Valor) que uso la propiedad _DestinationContentPath, que es la propiedad MSBuild que contiene la ruta hacia donde se implementa su aplicación, es decir, Servicios REST / 1.0.334 .

¿Puedes probar eso y decirme si te funcionó o no?


FYI: esto funciona para un sitio web raíz si sigue la convención especificada en la publicación aquí: http://forums.iis.net/p/1176955/1977169.aspx#1977169

<Match>^$(_EscapeRegEx_MSDeployDirPath)//@(CustomDirAcl)$</Match> <DefaultValue>{$(_MsDeployParameterNameForContentPath)}/@(CustomDirAcl)</DefaultValue> <Value>$(_DestinationContentPath)/@(CustomDirAcl)</Value>

Esta publicación también tiene la ventaja de poder especificar un bloque de subdirectorios en un solo ItemGroup.