背景:
我正在使用Visual Studio 2010中的部署工具.
我右键单击了我的项目并选择了"打包/发布"设置.把我所有的设置放在那里......
然后我使用"web deploy"将文件传输到运行远程代理服务的远程服务器,这很正常.我在我的Web.Release.config上做的转换做了他们的事情,服务器可以访问我手动创建的数据库.
问题:
我的下一步是让数据库部署也能正常工作.我进入了Package/Publish SQL选项卡并输入了目标数据库的Connection字符串.
(Data Source=MyDBServer;Initial Catalog=Database2;User ID=User;Password=pass)
Run Code Online (Sandbox Code Playgroud)
此数据库为空,准备接受导入.
我还输入了源数据库的连接字符串.它位于同一台服务器上.
(Data Source=MyDBServer;Initial Catalog=Database;User ID=User;Password=pass)
Run Code Online (Sandbox Code Playgroud)
Database Scripting选项设置为Schema和Data(更改此选项没有区别),数据库脚本设置为[Auto Generated Schema and Data]
当我现在部署它时,我收到错误:
错误4 Web部署任务失败.((09/06/2010 16:41:51)在远程计算机上处理请求时发生错误.)
(09/06/2010 16:41:51)在远程计算机上处理请求时发生错误.目前不期望输入类型"未知".序列化流可能已损坏.
附加信息:
我可以成功创建一个没有问题的包.我查看了zip中的内容,可以看到SQL生成正常(因此连接数据库没有问题).然后,我可以复制此SQL并将其作为新数据库的新查询运行,并且可以很好地创建表和数据.
我似乎无法找出出错的地方,我用Google搜索错误,并且整个互联网上都没有条目.有人有主意吗?
附录:
为了进一步了解可能发生的情况,我将包发送到服务器并使用IIS导入它.它告诉我,我需要SQL Server管理对象.所以我安装了它.接下来尝试它告诉我我的用户没有创建数据库的权限,我认为这一定是问题.:授予访问权限 - 重新运行.通过!所以我删除了所有的表,然后回到VS2010点击发布,我得到了同样的错误.:(
提供给命令行的以下MSDeploy字符串会导致错误.任何人都可以对此有所了解吗?
"C:\Program Files\IIS\Microsoft Web Deploy\\msdeploy.exe" -source:package='D:\dev\Project\obj\BuildConfiguration\Package\Project.zip' -dest:auto='Website Name',computerName='computername',userName='username',password='password' -verb:sync -enableRule:DoNotDeleteRule -allowUntrusted -debug
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Microsoft.Web.Deployment.DeploymentAgentUnavailableException: Could not complete the request to remote agent URL 'http://computername/MSDEPLOYAGENTSERVICE'.
---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of …Run Code Online (Sandbox Code Playgroud) 我需要能够在AppSettings部分中将一个参数添加到在使用MSDeploy进行部署的TFS构建期间生成的SetParameters.xml文件中.目前只有连接字符串被标记化.
如何从AppSettings部分添加密钥?
有人可以解释(比technet/msdn docs更好)汽车提供商究竟做了什么,它是如何工作的,以及何时使用它.
这与Web部署有关.我看过很多文档指定-dest:auto,这对我来说并没有多大意义.
自动提供程序指定目标上的提供程序与源提供程序相同.
例
msdeploy.exe -verb:sync -source:appHostConfig ="MySite"-dest:auto,computername = Server1
当destination参数与-source参数相同时,auto提供程序使您可以避免输入-dest参数的完整路径.它还消除了从存档或包中单独复制清单文件的需要.
自动提供程序获取您指定的源并使用目标计算机上的相应位置.例如,如果指定appHostConfig = Site1作为源,则目标计算机上的目标将为Site1.当您希望"按原样"将网站同步到远程计算机时,这非常有用.
technet docs for auto provider
没有意义的例子:
msdeploy.exe -verb:sync -source:package=myapp.zip -dest:auto
Run Code Online (Sandbox Code Playgroud)
为什么要将目标确切地设置为源?有什么意义?你不是简单地用iteslf覆盖源代码吗?
在VS2010中发布包生成的生成的cmd文件生成如下内容:
"C:\Program Files\IIS\Microsoft Web Deploy V2\\msdeploy.exe" -source:package='MySourcePath' -dest:auto"
Run Code Online (Sandbox Code Playgroud)
不自动意味着源只会覆盖自己吗?但事实并非如此,它实际上更新了IIS网站(基于清单中的设置)
我已经尝试使用包作为目标,在这种情况下,它确实更新了源包而不是IIS站点.
这个问题的催化剂是我正在实施CI,我过去总是使用msbuild/xcopy.我想现在使用msdeploy.我想理解它,而不是简单地调用从visual studio生成的myproject.cmd.
例如,此SO链接指定使用自动提供程序作为dest参数.
谢谢
我们成功地使用TFS2010中的msdeploy每天更新我们的开发网站.
这工作正常,直到我们升级到VS2012,我们的应用程序从.NET Framework 4.0升级到4.5,ASP.NET MVC从3.0升级到4.0.看起来一切都很好并且部署了程序集但实际上没有部署任何内容.
我现在已经研究了两天了,无法弄清楚为什么会发生这种情况,现在我的想法已经不多了.
以下是我的构建脚本的一部分,它在升级之前的工作方式.
<MSBuild
Projects="$(SolutionRoot)\My.Web\My.Web.csproj"
Properties="MvcBuildViews=False;AllowUntrustedCertificate=True;AuthType=Basic;Configuration=Dev;CreatePackageOnPublish=True;DeployIisAppPath=dev.myweb;DeployOnBuild=True;DeployTarget=MsDeployPublish;MSDeployPublishMethod=WMSvc;MsDeployServiceUrl=https://10.xxx.xxx.xxx:8172/MsDeploy.axd;UserName=UserName;Password=Password;UseMsdeployExe=True"
ContinueOnError="False"
/>
Run Code Online (Sandbox Code Playgroud)
启动升级并且我的问题发现我们使用的是Web Deploy 2.0,但现在我们已升级到Web Deploy 3.0.我也确保我们正在建设ToolsVersion="4.0".
更新 -
msbuild.exe/p:AllowUntrustedCertificate = True/p:AuthType = Basic/p:Configuration = Dev/p:CreatePackageOnPublish = True /p:DeployIisAppPath=dev.myweb/p:DeployOnBuild = True/p:DeployTarget = MsDeployPublish/p: MSDeployPublishMethod = WMSvc /p:MsDeployServiceUrl=https://10.xxx.xxx.xxx:8172/MsDeploy.axd/p:UserName = UserName/p:Password = Password/p:UseMsdeployExe = True E:\ Builds\1 \无论\ Daily_Build的\ Sources\My.Web\My.Web.csproj
现在我也尝试从我们的TFS运行上面的msbuild命令,没有任何响应让我完全失望.在TFS的事件日志中没有任何内容,日志文件中没有任何内容,无论冗长...有什么想法吗?
它确实可以使用msdeploy directy,如下所示;
<Exec Command=""C:\Program Files\IIS\Microsoft Web Deploy V3\MSDeploy.exe" -verb:sync -source:contentPath="E:\Builds\1\WhatEver\Daily_Build\Sources\My.Web\My.Web.csproj" -dest:contentPath="E:\dev.my.web",computername=https://10.xxx.xxx.xxx:8172/MsDeploy.axd,username=UserName,password=Password,authtype=Basic -allowUntrusted=True"
ContinueOnError="false" />
Run Code Online (Sandbox Code Playgroud)
-
更新2 - 似乎Microsoft添加了对可发布项目的类型项目和我们的Web应用程序不是的检查,因为输出类型是类库.这对v4.0有效,但显然不适用于v4.5.
任何人都知道该怎么做让它再次起作用?我需要更改项目类型吗?预先创建发布包,然后部署它?或者是什么?
-
有其他人遇到过同样的问题吗?你找到了分享的解决方案吗?
MSBuild版本可能存在问题吗?
ASP.NET 4.5中的新pubxml文件肯定是朝着正确方向迈出的一步.我也喜欢msdeploy对parameters.xml文件的支持(即使它们有时不像我想的那么强大).现在,我如何组合msdeploy参数和pubxml文件?我希望pubxml文件允许我提供类似的设置
<ParametersFile>productionParameters.xml</ParametersFile>
或者在我的production.pubxml文件中类似的东西,包含web.config在发布到生产环境时要合并的值.这是可能的还是我必须回到我自己的方式来确定参数文件并msdeploy使用-setParamFile ="productionParameters.xml"进行调用?
我在VS2012中有一个Web应用程序项目,我使用"Web部署包"发布.我希望此程序包包含应用程序池设置,特别是创建 IIS应用程序池并将新创建的应用程序分配给它.
我熟悉项目配置为使用IIS实例(不是IIS Express)时可用的"包括此Web项目使用的应用程序池设置"选项,但IIS配置不是项目文件的一部分,因此不是源代码受控.当有人在没有经过精心配置IIS的机器上构建部署包时会发生什么?不理想.
那么,我还可以将AppPool设置添加到我的Web部署包中吗?我知道appPoolConfig提供程序只是IIS7 +,我很好用这个限制.我过去一直反对这个问题,从来没有找到解决方案.18个月后,我们有了一个新的VisualStudio版本和一个新的网络发布管道,是否有新的选项来解决这个问题?或者也许是我第一次解决这个问题时错过了什么?
编辑
好的,我看到以下选项:
MSDeploy.MSDeployProviderOptions看起来有一些Base64编码的二进制文件?不知道该放什么.appPoolConfig提供者似乎只想读/写IIS,而不是设置的XML文件.有人知道吗?MyCustomPoolProvider将appPoolConfig部分写入清单?这听起来像是一种潜在的痛苦运动,可能会或可能不会起作用.我还需要弄清楚进入的编码MSDeploy.MSDeployProviderOptions吗?我感觉Web Deploy对于我正在努力实现的目标的根本障碍是它严格依赖于"提供者".预先存在的提供程序主要用于IIS同步,而不是主要开发和发布.碰巧这些提供商中的一些可以通过MSBuild 相对容易地连接,但大多数人坚持从IIS中提取数据,就是这样.
我有一个Web应用程序项目:

如您所见,有3个robots.txt文件 - 每个环境一个.还有3个发布配置文件.
现在,对于每个pubxml,我想选择正确的"robots.xxx.txt"文件并将其重命名为"robots.txt".理想情况下,我想利用MSBuild并在每个pubxml文件中保留配置.
3个发布配置文件中的每一个都在使用<WebPublishMethod>MSDeploy</WebPublishMethod>.
编辑:
刚试过Richard Szalay回答,但无济于事.所有3个文件仍然复制到输出目录.这就是我的发布配置文件现在的样子
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<PrecompileBeforePublish>True</PrecompileBeforePublish>
<EnableUpdateable>True</EnableUpdateable>
<DebugSymbols>False</DebugSymbols>
<WDPMergeOption>DonotMerge</WDPMergeOption>
<ExcludeApp_Data>True</ExcludeApp_Data>
<publishUrl>C:\Temp\myproject</publishUrl>
<DeleteExistingFiles>False</DeleteExistingFiles>
</PropertyGroup>
<ItemGroup>
<MsDeployReplaceRules Include="robots">
<ObjectName>filePath</ObjectName>
<Match>robots\.debug\.txt</Match>
<Replace>robots.txt</Replace>
</MsDeployReplaceRules>
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud) 我有一个在Visual Studio 2013中构建的DACPAC文件,用于SSDT项目.此SSDT项目定义了一个部署后脚本,用于将一些静态数据合并到已发布的表中,一个数据包含一个版权符号.
现在,当我通过Visual Studio发布数据库时,版权符号将被保留,并正确合并到目标表中.当我使用MSDeploy发布相同的数据库(使用相同的dacpac和发布配置文件)时,版权符号将作为"?"合并到目标数据库中.符号.同样,当我使用Action:Script而不是时Action:Publish,生成的SQL脚本包含"?" 而不是版权符号.
似乎Visual Studio脚本生成的脚本是UTF8编码的,但是烘焙到dacpac中的脚本会丢失UTF8编码.有没有人对如何解决这个问题有任何想法?
我有大量的Azure WebJob,它们都部署到单个Azure App Service,以及同一个Azure App Service上的网站。每个WebJob都使用WebJobs SDK和Microsoft.Web.WebJobs.Publish nuget包(我们是1.0.13版的最新版本)来打包它们以进行部署。以下是我们在CI构建(VSTS)中用于生成部署包的MSBuild参数:
/p:DeployOnBuild=true /p:PublishProfile=Release /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=$(Build.StagingDirectory)
这将产生一个与“ Azure Web Service Deploy” VSTS任务正常工作的程序包(因为WebJobs可以作为WebJobs正常运行),这不是问题。
问题是.zip文件包复制了所有WebJob程序集。这些重复最终将其复制到Azure应用服务中。
每个WebJob软件包的.zip文件中的文件夹结构为:
- Content/[build agent full path]/
- app_data/jobs/continuous/[web job name]/[assembly files]
- bin/[assembly files]
Run Code Online (Sandbox Code Playgroud)
造成问题的原因有3个:
bin/[assembly files]其发布到App Service,因此它们与网站的程序集相互混合,这些程序集也已部署到同一App Service。那么,为什么Microsoft.Web.WebJobs.Publish包bin/[assembly files]中除了必需的之外又添加了app_data/jobs/continuous/[WebJobName]/[assembly files]?更重要的是,如何防止包装过程包括在内bin/[assembly files]?
我真的很讨厌不得不添加构建步骤来拆分压缩后的软件包,然后将它们放回去而又不会产生多余的垃圾,或者我不得不想出一种手工制作发布软件包的方法。您有1个工作,Microsoft.Web.WebJobs.Publish!:)
msdeploy ×10
msbuild ×4
webdeploy ×4
.net-4.0 ×1
.net-4.5 ×1
asp.net-4.5 ×1
azure ×1
dacpac ×1
iis ×1
msbuild-4.0 ×1
sql-server ×1
tfs ×1
tfs2010 ×1
utf-8 ×1