使用powershell通过kudu zipdeploy发布到azure会在我尝试访问api之后导致401错误

ha5z0ras  于 2021-06-20  发布在  Kudu
关注(0)|答案(1)|浏览(351)

我有一个asp.net core 2.1.4项目,我可以在visual studio 2017 15.5.7中使用“发布”菜单项部署它,并部署到azure类型。这一切都很顺利。
我正在尝试使用一个bamboo构建/部署服务器部署这个项目,我已经获得了我的powershell脚本,将发布的文件以zip文件的形式上传到kudu zipdeploy rest端点,现在我可以在kudu部署列表中看到部署。这是在大卫艾博的帮助下,在这篇文章中解决的。
然而,现在,当我尝试在使用这个powershell kudu部署方法之后使用postman访问api时,我得到了一个401未授权状态。
使用vs2017 publish menu方法发布完全相同的版本可以让我很好地访问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端点,在部署后出现了一个401错误,他们在部署url上添加了一个/trailing/来解决这个问题。我试着用我的剧本,但没有任何区别。
下面是日志流中的一个片段,显示部署成功;

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未授权状态。
在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
我按照davidebbo的建议添加了站点扩展。我不再在azure日志流中获取“找不到文件”错误,但在使用kupu zipdeploy进行部署后尝试访问api端点时,仍然会收到401未经授权的错误。同样,如果我使用vs2017 publish部署,则不会出现此错误,并且一切正常。
这是我的门户网站上的azure扩展截图。
azure门户网站扩展
编辑#2-2018年4月30日
好的,我认为这个问题与多目标框架有关。我从解决方案中删除了需要多目标设置的项目,现在我可以使用bamboo中的zipdeploy进行部署,并且在访问端点时不再获得401未授权状态。我相信我可以使用这个选项,因为它们是多目标的项目实际上不需要部署到azure,因为它们是与db相关的实用程序,我可以从一个以azure数据库为目标的本地服务器上运行它们。

r8uurelv

r8uurelv1#

我想我可能知道你的问题是什么,这与zipdeploy没有直接关系。与旧的核心运行时不同,2.1没有安装在vm上(因为它是预览版)。相反,您需要在web应用程序中安装一个站点扩展。有关详细信息,请参阅此页(该页是为preview 1编写的,但preview 2的处理方式相同)。
我使用一个干净的web应用程序、vs中的默认new core 2.1 preview 2和zip deploy尝试了这一点。安装了站点扩展后,它运行良好。

相关问题