CSPACK sitePhysicalDirectories being ignored? - azure

Yet another issue with CSPACK...
I have a service definition file like this:
<ServiceDefinition name="core-eur" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2014-01.2.3">
<LoadBalancerProbes>
<LoadBalancerProbe name="discovery.probe" protocol="http" path="/HealthMonitoring" port="80" intervalInSeconds="8" timeoutInSeconds="16" />
</LoadBalancerProbes>
<WebRole name="Discovery.UI" vmsize="ExtraSmall" enableNativeCodeExecution="false">
<Startup>
<Task commandLine="startup\CreateCustomEventSource.cmd" executionContext="elevated" taskType="simple" />
</Startup>
<Sites>
<Site name="main">
<Bindings>
<Binding name="https.root" endpointName="https" hostHeader="testingblah.com" />
</Site>
<Site name="api" physicalDirectory="..\..\..\catalog\Catalog.Search.API">
<Bindings>
<Binding name="https.root" endpointName="https" hostHeader="api.testingblah.com" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="http" protocol="http" port="80" loadBalancerProbe="discovery.probe" />
<InputEndpoint name="https" protocol="https" port="443" certificate="bibliothecatest.com" />
</Endpoints>
<Imports>
<Import moduleName="RemoteAccess" />
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteForwarder" />
</Imports>
<Certificates>
<Certificate name="testingblah.com" storeLocation="LocalMachine" storeName="CA" />
</Certificates>
</WebRole>
The key points are the Sites "main" and "api". I've not included the physical directory because, as expected, when they are put in and point to the project files in the solution, the "api" site is not packaged correctly as the Visual Studio package process will only package the first site (i.e. "api" has all the un-transformed .config files and .cs files in it's packaged folder whereas "main" does not - it is correctly packaged, but this is a known issue so I'm not going to complain too much about this.
So to workaround it, for my build server I want to introduce a CSPACK step to do this properly. I pre-build the "main" and "api" web sites using MSDEPLOY to a temporary location, and then use CSPACK to create the package file.
This fails every time with "CloudService077: Need to specify the physical directory for the virtual path 'main/ of role "Discovery.UI". However, I am including the /sitePhysicalDirectories value in CSPACK, i.e.
cspack %root%\ServiceDefinition.csdef ^
/role:Discovery.UI;%compiled%\discovery\Discovery.UI\ ^
/sitePhysicalDirectories:Discovery.UI;main;%compiled%\discovery\Discovery.UI\ ^
/sitePhysicalDirectories:Discovery.UI;api;%compiled%\catalog\Catalog.Search.Api\ ^
/rolePropertiesFile:Discovery.UI;Properties.txt ^
/out:%output% /copyOnly
If I put the sitePhysicalDirectories attribute back into the ServiceDefinition file, and point it to the project directory location in Visual Studio (e.g.)
<Site name="main" physicalDirectory="..\..\..\discovery\Discovery.UI">
then CSPACK fails with CloudServices079: Cannot find the physical directory "nnn" for virtual path main/
This is despite the fact that the CSPACK command line /sitePhysicalDirectories are correct. What's happening is that CSPACK is taking the ServiceDefinition values, applying the relative path values and pointing to completely the wrong place.
If I update ServiceDefinition to use the same physical location (e.g. C:\....\nnnn as opposed to "......\nnnn" that I'm passing in the CSPACK command line, everything works !
So it seems that CSPACK ignores parameters and cannot override values, which isn't what I really need. Is this correct or should I be passing something else to CSPACK?
Azure SDK 2.3

I know this is long after the fact, but I also had endless trouble with CSPACK. It is basically impossible to find any useful information on it.
What I've found, is that if you don't provide the arguments properly, you get all sorts of "Cannot find the physical directory..." and "Need to specify the physical directory..." errors, sometimes with directories that you did not provide.
Thanks to this powershell script I was able to execute it using the correct format and learned these things:
1. You must specify the /role: argument. The /sites argument is an extension of the role you specify here.
2. Put all your sites in one /sites argument or in one /sitePhysicalDirectories argument. I use the /sites argument for my builds.
For the above example, I would try:
cspack %root%\ServiceDefinition.csdef
/role:Discovery.UI;%compiled%\discovery\Discovery.UI\ /sites:Discovery.UI;main;%compiled%\discovery\Discovery.UI\;api;%compiled%\catalog\Catalog.Search.Api\ /rolePropertiesFile:Discovery.UI;Properties.txt
/out:%output% /copyOnly

Related

Deleting an application directory from iss with appcmd and reports identifer needed

I have somehow created an application directory with the appcmd command that has hidden all of my applications directory.
I can do a list of my application directories with appcmd and I think the last directory I created has the file path with a double quote character at the end, so I'm trying to delete that one application directory.
When I run the command appcmd list app I get the list of my application directories which do not show up in the UI.
Here is a list of the last three:
APP "Default Web Site/hotele/language90" (applicationPool:DefaultAppPool)
APP "Default Web Site/hotele/business900" (applicationPool:DefaultAppPool)
APP "Default Web Site/hotelk" (applicationPool:DefaultAppPool)
When I attempt to delete the hotelk one which is the one I think is messing up all of the directories I try running this command:
appcmd delete app "Default Web Site"/"hotelk"
It gives me this error:
message:Must use exact identifier for APP object with verb DELETE.
I've tried many different combinations of this delete syntax and not use what is meant by the identifier?
I can't delete this application directory with the IIS UI since when I go there all of my application directories do not appear.
First of all try to delete the app from Internet Information Services (IIS) Manager GUI.
If you can't find your app there you can manually edit IIS configuration file (ApplicationHost.config):
Go to path %windir%\system32\inetsrv\config
Create a backup of ApplicationHost.config file
Open ApplicationHost.config file
Search the name of the app you want to remove (ex. hotelk). You should find it in the <sites> section:
<sites>
<site name="Default Web Site" id="1">
...
</site>
<site name="hotelk"" id="2">
<application path="/">
<virtualDirectory path="/" physicalPath="d:\test" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
</site>
<siteDefaults>
...
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
remove the entire node containing the site you want to delete
save the file
If you want delete the app using appcmd this is the right command:
appcmd delete app "Default Web Site/hotelk"

Adding additional content folders to Azure package

Im using Azure SDK 2.5
I have a web role in a cloud service project. I would like to add a folder in some fashion such that it is deployed in the parent directory of the approot. I havent found a way to do this which kind of makes me wonder what use is the ability to define virtual directories in csdef.
So I thought I would try adding folders via the Contents/Content xml config in the csdef. I am either fundamentally misunderstanding what this bit of config does or its hopelessly broken.
Assuming this folder structure
/
/CloudService
/SomeOtherContent
If I define the following:
<Contents>
<Content destination="frontend">
<SourceDirectory path="..\SomeOtherContent" />
</Content>
</Contents>
and build I get:
error CloudServices089: Cannot find the source directory
'C:\src\template\src\Template.CloudService\bin\Debug\..\SomeOtherContent'
Ok so its starting the bin\Debug, so I'll just make it ..\..\..\SomeOtherContent
error CloudServices089: Cannot find the source directory
'C:\src\template\src\Template.CloudService\..\..\..\SomeOtherContent'
Yes thats right, the folder at which my relative path is resolved has changed!!! Its no longer bin\Debug. Wtf!? How can this be made to work? It works if i enter a full drive qualified absolute path.
So I solved this by having MSBuild resolve the path and push it in to an environment variable which I called FrontendDir.
<Contents>
<Content destination="frontend">
<SourceDirectory path="%FrontendDir%" />
</Content>
</Contents>
and in the ccproj I added:
<UsingTask
TaskName="SetEnvironmentVariableTask"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll">
<ParameterGroup>
<Name ParameterType="System.String" Required="true" />
<Value ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Environment.SetEnvironmentVariable(Name, Value);
]]>
</Code>
</Task>
</UsingTask>
<Target Name="BeforeBuild" Condition=" '$(FrontendDir)' == '' ">
<Message Text="Setting Project Dir" Importance="high" />
<SetEnvironmentVariableTask Name="FrontendDir" Value="$(ProjectDir)\..\Template.FrontEnd\dist" />
</Target>
Its preferable to put the entire path into the env var here as you can then override it easily in your different build scenarios by overriding the value (eg. /p:FrontendDir="c:\foo")
So that works and works fairly well. I still say the behaviour I was seeing before with the relative path resolution changing folders is... broken. It just doesn't work with relative paths in any usable way.
You are seeing the same error but from different msbuild targets.
The first error (when using ..\..\) is thrown at PreValidateServiceModel which passes in the Source location and checks the path
ServiceDefinitionFile="#(SourceServiceDefinition)"
ServiceConfigurationFile="#(SourceServiceConfiguration)"
C:\src\Azure\ServiceDefinition.csdef : error CloudServices089: Cannot
find the source directory 'C:\src\Azure\..\..\Installers\' in role
WebHost. [C:\src\Azure\Azure.ccproj]
Done building target "PreValidateServiceModel" in project "Azure.ccproj" -- FAILED.
The second error is thrown at ValidateServiceFiles which passes in the Target location
ServiceDefinitionFile="#(TargetServiceDefinition)"
ServiceConfigurationFile="#(TargetServiceConfiguration)">
C:\src\Azure\bin\Release\ServiceDefinition.csdef : error CloudServices089: Cannot
find the source directory
'C:\src\Azure\bin\Release\Installers\'
in role WebHost. [C:\src\Azure\Azure.ccproj]
Done building target "ValidateServiceFiles" in project "Azure.ccproj" -- FAILED.
If you reflect on C:\Program Files\Microsoft SDKs\Azure.NET SDK\v2.9\bin\ServiceDescription.dll you can see the ProcessRoleContents method doing the validation but using the SourceFile to resolve the location.
One option is to make sure the target folder exists (even if empty) before the build starts.
It would be better if the PreValidation resolved the path and when the Target is saved, it had the full path.
I ended up editing the ccproj, and adding this
<Target Name="BeforeAddRoleContent">
<ItemGroup>
<AzureRoleContent Include="Installers\">
<RoleName>Azure</RoleName>
<Destination></Destination>
</AzureRoleContent>
</ItemGroup>
</Target>
Referencing runtime content from .ccproj (Azure SDK 2.9)

physicalDirectory and Redirection in azure

My .csdef file:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="SimpleAzure1.Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8">
<WebRole name="SimpleAzure1" vmsize="Small">
<Sites>
<Site name="Web2" physicalDirectory="../../../SimpleAzure1/">
<Bindings>
<Binding name="Endpoint2" endpointName="Endpoint2" hostHeader="SimpleAzure1.cloudapp.net" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint2" protocol="http" port="80"></InputEndpoint>
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
</ServiceDefinition>
And my project structure is:
I define physicalDirectory="../../../SimpleAzure1/" in .csdef but when I create a package and deploy in azure physicalDirectory's default.aspx page is not loaded.Its load a page from asp.net wepappliaction.When I define physicalDirectory in .csdef file why asp.net wepappliaction page is loading.Am I missing some thing.Thanks.
Concur with knightpfhor - if you only have one site, remove the physical directory and host header.
If you are using more than one site in the role, deployment changed from SDK 1.7 to 1.8:
The physicalDirectory attribute path is relative to the directory in
which the target Service Definition file resides when packaged. In
previous versions this file was located within the root project
directory. In this version, by default, this file is located in the
project output directory. You may need to update the relative path to
reflect the new location of the target Service Definition file.
To see where the files are actually located, enable remote access and RDP into the instance. Check the Physical Directory specified in IIS and then confirm that path exists and references the installed website, typically E:\sitesroot\0 or F:\sitesroot\0
If you only have one site in your web role then there is no need to specify the physical directory or the host header.I suspect the builder is taking some short cuts. Try removing the site from the role and adding it again and this time leave the defaults.

FailedRequestTracing module failed to create directory in azure

I try to run my Azure site using SDK1.8 locally.I got a following error in event viewer.
'\\?\C:\Users\Shree\AppData\Local\dftmp\Resources\eb8b9108-45c8-4933-8e47-50be3a36cbd9\directory\DiagnosticStore\FailedReqLogFiles\Web\deployment18(154).App.Azure.App_IN_0_Web\'. No logs will be generated until this condition is corrected......
In browser I got a error:
403 - Forbidden: Access is denied.
In .csdef file i use physicalDirectory like this.
<Site name="Web" physicalDirectory="..\..\..\dec31">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
Thanks.
I solve this problem. Its not a problem about .csdef file.Its a problem in my web.config
file.There is a frame work conflict.So I modify the web.config and its work.

IISExpress Log File Location

IISExpress writes log and configuration data to pre-determined location out of the box.
The directory is an "IISExpress" directory stored in a user's Documents directory.
In the directory is stored the following folders files underneath.
Config
Logs
TraceLogFiles
The location of my home directory is on a network share, determined by group policy
Currently we are encountering scenarios where visual studio locks up when stopping debugging Silverlight applications using IIS Express.
I was looking to change the location for the log & configuration data for IISExpress to see if this fixes the problem of visual studio locking up. Is it possible to change the default location of log & config files ?
1 . By default applicationhost.config file defines following two log file locations. Here IIS_USER_HOME would be expanded as %userprofile%\documents\IISExpress\.
<siteDefaults>
<logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
<traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" />
</siteDefaults>
You can update above directory paths to change the log file locations.
2 . If you are running IIS Express from command line, you can use '/config' switch to provide configuration file of your choice. Following link may help you http://learn.iis.net/page.aspx/870/running-iis-express-from-the-command-line/
http://www.iis.net/configreference/system.applicationhost/sites/sitedefaults
<configuration>
<system.applicationHost>
<sites>
<siteDefaults>
<logFile
logFormat="W3C"
directory="%SystemDrive%\inetpub\logs\LogFiles"
enabled="true"
/>
<traceFailedRequestsLogging
enabled="true"
directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles"
maxLogFiles="20"
/>
<limits connectionTimeout="00:01:00" />
<ftpServer serverAutoStart="true" />
<bindings>
<binding
protocol="http"
bindingInformation="127.0.0.1:8080:"
/>
</bindings>
</siteDefaults>
</sites>
</system.applicationHost>
</configuration>
I find web.config documentation is a messy. It is therefore better to provide a complete parent history than a floating snippet with the expectation that the reader naturally knows where it goes.
By default it will be in:
C:\Users\ user_name \Documents\IISExpress\Logs\

Resources