我在Visual Studio中有一个WCF项目需要部署到客户端的测试服务器。当我意识到我不知道如何将我的项目从Visual Studio 2010转移到我可以部署在客户端服务器上的东西时,我正处于宣布“Mission Accompleished”的边缘。
我对此问题的要点是,在部署到客户端时,我们使用 makefile 进行构建和打包。这意味着我需要一个命令行可执行文件来执行我需要做的任何事情来部署我的WCF服务。我确实发现右键单击项目并选择“Build Deployment Package”,但由于我需要通过命令行执行,所以我认为这不会有太大帮助。
此问题的第二部分奖励是,一旦我将打包文件作为客户端的服务器,我不知道如何处理它。现在,如果我知道对打包的部署文件有什么期望,我可能会有更好的想法,但在此之前,这只是猜测。
答案 0 :(得分:9)
好的,这就是我想出来的。
首先,包装。使用msbuild。像这样的东西(显然你需要使用v4或更好的.NET版本才能成功):
C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe {project_file} /t:package /target:Build /p:PlatformTarget=x86;
相当简单吧?
现在,问题的奖金部分,部署。这包括简单部分和硬部分。简单的部分是将msbuild.exe添加到IIS中创建的.zip文件。我找到了两种可能性。
第一个是命令行,它给了我一些问题(关于无法投射' Microsoft.Web.Deployment.DeploymentProviderOptions '键入' Microsoft.Web.Deployment.DeploymentProviderOptions ' --- 我知道,对吗?)。无论如何,这是我使用的命令行。它可能会帮助某人,也可能不会。我再次遇到了问题
c:\inetpub\wwwroot>"c:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -presync:runCommand="md c:\inetpub\wwwroot\{MyWCFCodeDest} & c:\windows\system32\inetsrv\appcmd add site /name:{MyWCFCodeDest} /id:22 bindings:http/*:54095: /physicalPath:c:\inetpub\wwwroot\{MyWCFCodeDest}" -source:package={ZipFileFromMSBuild.exe} -dest:auto -setParam:"IIS Web Application Name"="{MyIISName}"
好的,所以我决定用第二种方式很开心。如果你不关心自动化,它是迄今为止最简单的。打开IIS管理器,右键单击计算机或网站(取决于您是将其作为自己的网站还是现有网站中的应用程序),部署,导入,并按照向导进行操作。
现在我花了大部分时间。我点击了我新部署的.svc文件并收到错误消息。此错误涉及我使用的证书。现在,也许不是所有部署都不必担心这一点,但我的确如此。错误是冗长的,"键集不存在" 和"由于编译期间的异常而无法激活" 和"可能没有能够进行密钥交换的私钥,或者该进程可能没有私钥的访问权限" 。我尝试了很多东西,包括使用mmc重新导入证书和makecert来重新创建我的CA和我的个人证书。这对我来说都不是问题(ymmv)。最后,我专注于用户权限。我发现,如果我将Everyone用户的权限授予证书的私钥(证书需要私钥),那么一切都有效。显然不是我想要的客户端解决方案,所以我追捕了正确的用户权限。令人惊讶的是,这需要一段时间。各种网站让我添加了网络服务,ASPNET,当前用户,在machine.config中指定的用户(在某个.NET目录中),IIS_ {MachineName} ......这些都没有。我必须添加的是 IIS_IUSRS 。
所以,尽管遵循了所有的指示,但是当你向你的显示器尖叫时,一些可以帮助你理智的鱼子酱这对你来说并不适合你。因为显然IIS随着时间的推移而变化太大,这些东西确实很重要:
Windows 7 Ultimate sp1
IIS 7.5.7600.16385
此外,您可能感兴趣的一些命令行工具:
- winhttpcertcfg.exe -l -c LOCAL_MACHINE \ My -s" {cert_name}" - 列出授权访问证书私钥的用户(您可以也是通过文件属性的老式方式);我尝试下载winhttpcertcfg.exe,但它是Windows 2003程序包的一部分,它提供了关于不兼容的警告(不确定它是否来自我尝试安装该文件,或者它现在是否已经安装了我已安装的内容)
- winhttpcertcfg.exe -g -c LOCALHOST \ My -s" {cert_name}" -a IIS_IUSRS - 将IIS_IUSRS添加到证书私钥的权限中
- findprivatekey.exe My LocalMachine -n" {cert_name}" - 查找指定证书的私钥文件;出于某种原因,这是一个你必须自己在Dev Studio中构建的工具(在从Microsoft下载的一些WCF示例中找到)
- cacls.exe {private_key_file_for_cert} / E / G" IIS_IUSRS" - 将用户添加到私钥的权限的另一种方法
- mmc - 为已安装的证书启动经理
- makecert -n" CN = {CertificateAuthorityName}" -r -sv {CertificateAuthorityName} .pvk {CertificateAuthorityName} .cer - 创建证书颁发机构证书
- makecert -sk {SignedCertName} -iv {CertificateAuthorityName} .pvk -n" CN = {SignedCertName}" -ic {CertificateAuthorityName} .cer {SignedCertName} .cer -sr localmachine -ss My - 创建由证书颁发机构签名的证书
最后一件事:如果您想使用mmc导入证书,则需要启动mmc,File-> Add / Remove Snapin。添加证书管理单元。将证书颁发机构导入受信任的根证书颁发机构,并将证书颁发机构签署的证书导入Personal。
希望你在这里享受骑行乐趣。请等待浏览器在退出前完全停止,请记得随身携带任何个人物品。
当需要将所有内容部署到测试服务器(而不是我的开发机器)时,我并不期待遇到的所有麻烦。我在这里再次记录这些,以便帮助其他一些可怜的,失去灵魂的人(或者我以后的日子)。
- 这个应该很明显: FindPrivateKey.exe 不在服务器上。我不得不跳过一些箍来把它拿到那里。因人而异。
- 只有客户端4.0版本的.NET已安装在服务器上。当我发现这个并意识到这是一个问题时,几个小时过去了。发现已安装的.NET版本来自 netfx_setupverifier ,这是我从微软的一个网站获得的。客户端版本不包含所有WCF内容
-IIS需要一些额外的设置(在.NET Framework版本目录中找到的文件,从命令行运行):
aspnet_regiis.exe -i -enable
ServiceModelReg.exe -r
- cacls.exe 告诉我它已被弃用,我应该使用 icacls.exe 。 icacls的命令行是这样的:
icacls.exe {private_key_file_for_cert} /GRANT "IIS_IUSRS":R
(请注意,这并不适合我,但您可以随时转到{private_key_file_for_cert}文件,可能是在ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys中,并通过资源管理器授予权限 - 对 - 点击 - 属性)
- 您可能需要为WCF添加处理程序映射。我强烈建议让它在.NET v4.0的应用程序池下运行。