这是一个相当冗长的问题,但它确实很好地解释了它。
我有一个 Web 角色,该角色具有一个根站点,该根站点转发到该站点下的虚拟应用程序。 我的项目在本地运行良好,在云中几乎完美运行。 我正在使用新的生成配置来使我的站点的 web.config 在 Azure 上运行(因为我需要使用 sql 会话状态)。
无论如何,在检查我的托管站点时,我可以看到文件夹 3、1、2 中的 0、1、2 个站点。 0 代表我的根目录,该文件夹的内容是托管应用程序的最小内容,只是我的 bin、default.aspx、packages 和 web.config。 这很好用,我可以通过关注数据库中的会话来看到它的工作原理。
但是,当检查代表虚拟应用程序的其他(相同)文件夹时,我可以看到整个Visual Studio项目。 代码文件、web.config 转换等。 更重要的是,转换实际上并未得到处理。 整个项目只是被倾倒在那里。
我已使用 Visual Studio 2010 将我的应用程序发布到我的 Web 角色。 我在那里的设置中看不到任何明显的东西来控制这种行为。 如果有帮助,这是我的服务定义文件的一部分。
<WebRole name="root" vmsize="Small">
<Sites>
<Site name="Web">
<VirtualApplication name="en" physicalDirectory="../../../sitefolder" />
<VirtualApplication name="en-gb" physicalDirectory="../../../sitefolder" />
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteAccess" />
</Imports>
</WebRole>
<WorkerRole name="emailer" vmsize="ExtraSmall">
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteAccess" />
<Import moduleName="RemoteForwarder" />
</Imports>
</WorkerRole>
那里也有配置设置,但我省略了它们。 非常感谢您在这里提供的任何帮助。
编辑 1以下是在实施此处详述的更改后,我的解决方案中的 Windows Azure 项目的项目文件:http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
*** entire content as normal and untouched manually ***
<!-- Import the target files for this project template -->
<PropertyGroup>
<VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">$(MSBuildExtensionsPath)MicrosoftVisualStudiov$(VisualStudioVersion)Windows Azure Tools2.0</CloudExtensionsDir>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Staging01' ">
<OutputPath>binStaging01</OutputPath>
</PropertyGroup>
<PropertyGroup>
<!-- Inject the publication of "secondary" sites into the Windows Azure build/project packaging process. -->
<CoreBuildDependsOn>
CleanSecondarySites;
PublishSecondarySites;
$(CoreBuildDependsOn)
</CoreBuildDependsOn>
<!-- This is the directory within the web application project directory to which the project will be "published" for later packaging by the Azure project. -->
<SecondarySitePublishDir>azure.publish</SecondarySitePublishDir>
</PropertyGroup>
<!-- These SecondarySite items represent the collection of sites (other than the web application associated with the role) that need special packaging. -->
<ItemGroup>
<SecondarySite Include="..bobblejob.combobblejob.com.csproj" />
</ItemGroup>
<Target Name="CleanSecondarySites">
<RemoveDir Directories="%(SecondarySite.RootDir)%(Directory)$(SecondarySitePublishDir)" />
</Target>
<Target Name="PublishSecondarySites" Condition="'$(PackageForComputeEmulator)' == 'true' Or '$(IsExecutingPublishTarget)' == 'true' ">
<MSBuild Projects="%(SecondarySite.Identity)" Targets="Build;_WPPCopyWebApplication" Properties="Configuration=$(Configuration);Platform=$(Platform);WebProjectOutputDir=$(SecondarySitePublishDir)" />
</Target>
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
</Project>
为了进行此编译,我必须在 bobblejob.com 文件夹中手动创建一个文件夹"azure.publish"。 错误可能是您说构建应该仅在IsExecutingPublishTarget为真时运行的地方吗? 我希望它在我的开发盒和我设置的任何和所有部署上运行......
-- 11/09/13 - 这仍然是一个问题。 有人有解决方案吗?
您遇到了一个与我今年早些时候在博客中介绍的情况非常相似的问题。 请参阅 http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
基本上,当Visual Studio打包你的Web角色时,它不会"知道"physicalDirectory属性指定的文件是Web项目,因此不会执行任何正常的生成操作(编译,配置转换等)。
我的博客文章介绍了一种通过将一些自定义操作注入到生成过程中来解决此问题的方法。 希望对您有所帮助!
我终于有了这个工作,这要归功于上面的链接。
我第一次尝试这种方法时它不起作用。 此后我重试并有效 - 点击上面的链接。 我想在尝试这两种方法之间,我已经在MSBuild上阅读了,因此能够阅读并理解正在发生的事情。
我唯一不同的是,我将临时发布文件夹命名为"azure_publish"而不是"azure.publish"。 我还没有读够,不知道句点是否是保留字符。
谢谢麦科利尔。 确保您从Microsoft那里获得佣金。;-)