使用powershell通过Kudu ZipDeploy发布到Azure后,当我尝试访问API时会导致401

时间:2018-04-27 13:50:16

标签: powershell azure bamboo kudu azure-app-service-envrmnt

我有一个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扩展程序截图。

Azure Portal Site Extensions

编辑#2 - 4/30/18

好的,我相信这个问题与多目标框架有关。我从需要多目标设置的解决方案中删除了项目,现在我可以在Bamboo中使用ZipDeploy进行部署,并且在访问端点时我不再获得401 Unauthorized状态。我相信我可以使用此选项,因为它们是多目标的项目实际上不需要部署到Azure,因为它们是与数据库相关的实用程序,我可以从面向Azure数据库的本地服务器运行它们。

1 个答案:

答案 0 :(得分:1)

我想我可能知道你的问题是什么,而且它与zipdeploy没有直接关系。与较旧的Core运行时不同,VM未安装2.1(因为它是预览版)。相反,您需要在Web App中安装站点扩展。有关详细信息,请参阅this page(页面是为预览1编写的,但预览2的处理方式相同)。

我尝试使用干净的Web应用程序,VS中的默认新Core 2.1 Preview 2和zip部署。安装网站扩展后它运行正常。