我有一个ASP.Net Core 2.1.4项目,我可以使用“发布”菜单项和“部署到Azure”类型从Visual Studio 2017 15.5.7中部署它。这一直很好。
我正在尝试使用Bamboo Build / Deployment服务器部署此项目,我已经获得了powershell脚本,将已发布的文件以zip文件形式上传到Kudu Zipdeploy REST端点,我现在可以在Kudu部署列表。这是在David Ebbo的帮助下在SO post中得出的。
但是,现在,当我尝试在使用此PowerShell Kudu部署方法后使用Postman访问API时,我获得了401未经授权的状态。
使用VS2017发布菜单方法发布完全相同的构建允许我很好地访问API,因此通过Bamboo部署和Powershell对我的Kudu发布仍然有些不正确。
这是我的Powershell功能;
Function Upload-ZipDeploy() {
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $PublishingUsername, $publishingPassword)))
$userAgent = "powershell/1.0"
if(!$SlotName)
{
$apiUrl = "https://$WebAppName.scm.azurewebsites.net/api/zipdeploy"
}
else {
$apiUrl = "https://$WebAppName-$SlotName.scm.azurewebsites.net/api/zipdeploy"
}
$filePath = $LocalPath
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method Post -InFile $filePath -ContentType "multipart/form-data"
}
我读了一篇关于zip端点的MS论坛帖子,并在部署后得到401错误,他们通过在部署URL上放置一个尾随/来解决它。我尝试使用我的脚本,但它没有任何区别。
以下是日志流中的一个片段,显示部署成功;
2018-04-27T13:34:37 Finished successfully.
2018-04-27T13:34:37 Running post deployment command(s)...
2018-04-27T13:34:37 Deployment successful.
2018-04-27 13:34:37.160 +00:00 [Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request starting HTTP/1.1 POST http://127.0.0.1:13601/iisintegration 0
2018-04-27 13:34:37.177 +00:00 [Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request finished in 16.935ms 202
但是,当我尝试在此Kudu部署后尝试访问其中一个API端点时,我获得了401 Unauthorized状态。
在Azure中查看API的日志流时,我看到以下内容;
018-04-27 13:37:32.814 +00:00 [Critical] Microsoft.AspNetCore.Hosting.Internal.WebHost: Hosting startup assembly exception
System.InvalidOperationException: Startup assembly
Microsoft.AspNetCore.AzureKeyVault.HostingStartup failed to execute. See the
inner exception for more details. ---> System.IO.FileNotFoundException:
Could not load file or assembly
'Microsoft.AspNetCore.AzureKeyVault.HostingStartup, Culture=neutral,
PublicKeyToken=null'. The system cannot find the file specified.
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String
codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint,
StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean
throwOnFileNotFound, Boolean forIntrospection, Boolean
suppressSecurityChecks, IntPtr ptrLoadContextBinder)
at
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName
assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly,
StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean
throwOnFileNotFound, Boolean forIntrospection, IntPtr ptrLoadContextBinder)
at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
at
Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices
(AggregateException& hostingStartupErrors)
--- End of inner exception stack trace ---
此时,我被卡住了。我在这里缺少什么?
编辑#1 4/30/18
我按照David Ebbo的建议添加了网站扩展程序。我不再在Azure日志流中收到文件未找到错误,但在使用Kupu ZipDeploy部署后尝试访问我的API端点时,我仍然收到401 Unauthorized错误。同样,我没有得到这个错误,如果我使用VS2017发布部署,一切正常。
以下是我门户网站上的Azure扩展程序截图。
编辑#2 - 4/30/18
好的,我相信这个问题与多目标框架有关。我从需要多目标设置的解决方案中删除了项目,现在我可以在Bamboo中使用ZipDeploy进行部署,并且在访问端点时我不再获得401 Unauthorized状态。我相信我可以使用此选项,因为它们是多目标的项目实际上不需要部署到Azure,因为它们是与数据库相关的实用程序,我可以从面向Azure数据库的本地服务器运行它们。
答案 0 :(得分:1)
我想我可能知道你的问题是什么,而且它与zipdeploy没有直接关系。与较旧的Core运行时不同,VM未安装2.1(因为它是预览版)。相反,您需要在Web App中安装站点扩展。有关详细信息,请参阅this page(页面是为预览1编写的,但预览2的处理方式相同)。
我尝试使用干净的Web应用程序,VS中的默认新Core 2.1 Preview 2和zip部署。安装网站扩展后它运行正常。