Powershell Azure project Kudu接受上传到Zipdeploy端点的zip文件,但不部署

Powershell Azure project Kudu接受上传到Zipdeploy端点的zip文件,但不部署,powershell,azure,bamboo,kudu,azure-app-service-envrmnt,Powershell,Azure,Bamboo,Kudu,Azure App Service Envrmnt,我有一个ASP.NET Core 2.0 API作为Azure应用程序服务,它有一个用于QA的部署槽,我已经使用了几个月。我在VS2017中开发,并使用项目的内置发布到Azure应用程序服务组件发布到Azure。这很好用 我现在正试图将部署移动到一个部署服务器 我通常遵循与此链接类似的过程 在我的竹子构建中,我运行一个Powershell脚本调用dotnet publish,将发布文件放在一个输出文件夹中,然后将这些文件压缩到一个zip文件中,并将其用作工件。然后,在我的竹类部署项目中,我引用该

我有一个ASP.NET Core 2.0 API作为Azure应用程序服务,它有一个用于QA的部署槽,我已经使用了几个月。我在VS2017中开发,并使用项目的内置发布到Azure应用程序服务组件发布到Azure。这很好用

我现在正试图将部署移动到一个部署服务器

我通常遵循与此链接类似的过程

在我的竹子构建中,我运行一个Powershell脚本调用dotnet publish,将发布文件放在一个输出文件夹中,然后将这些文件压缩到一个zip文件中,并将其用作工件。然后,在我的竹类部署项目中,我引用该工件并运行Powershell脚本,该脚本使用Invoke WebRequest调用Kudu端点,如下所示

Invoke-WebRequest -Uri "https://userName:userPassword@MySiteDeploymentSlot.scm.azurewebsites.net/api/zipdeploy" `
-InFile zipfileName -ContentType "multipart/form-data" -Method Post -UseBasicParsing   
Username和UserPassword是我从Azure门户中部署槽的发布配置文件中获得的,ZipFileName是工件中的zip文件,它是我项目的压缩发布输出

注意:我现在使用Kudu URL中的实际值只是为了让流程正常工作,而不必在将用户名和密码属性作为参数传递给Powershell时回勾,其他人在使用Powershell进行此流程时已报告了这些参数

当脚本运行时,我得到以下结果

StatusCode        : 200
StatusDescription : OK
Content           : 

                    <!DOCTYPE html>
                    <html dir="ltr" class="" lang="en">
                    <head>
                        <title>Sign in to your account</title>
                        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                        <meta http-eq...
RawContent        : HTTP/1.1 200 OK
                    Pragma: no-cache
                    Strict-Transport-Security: max-age=31536000; includeSubDomains
                    X-Content-Type-Options: nosniff
                    X-Frame-Options: DENY
                    x-ms-request-id: 31607f18-c30a-46f3-bdaf-d84a...
Forms             : 
Headers           : {[Pragma, no-cache], [Strict-Transport-Security, max-age=31536000; includeSubDomains], 
                    [X-Content-Type-Options, nosniff], [X-Frame-Options, DENY]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : 
RawContentLength  : 34599
由于我得到一个状态代码200,我假设它已上载,但当我查看Kudu部署端点时,它不会出现在部署列表中

我的理解是,您只需将一个zip文件上载到Kudu zipdeploy端点,然后将其部署到指定的Azure部署槽中。但当我查看Kudo网站的文件日期时,它们都表明了我一周前在VS2017上做的最后一次发布

很明显,我遗漏了一些东西

从ZipDeploy返回的响应,即使是状态200,也会在标题部分Title属性中的文本登录到您的帐户。我还看到DENY X-Frame-Options:DENY这个词,但我不知道这是否与我看到的问题有关


有什么想法吗?

我认为问题在于调用WebRequest不尊重URL中传递的信誉。相反,您需要显式地传递基本auth头

试着这样做:

$webapp = "MyApp"
$username = "`$MyApp"
$password = "ThePasswordFromPublishProfile"
# Note that the $username here should look like `SomeUserName`, and **not** `SomeSite\SomeUserName`
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))

$apiUrl = "https://$webapp.scm.azurewebsites.net/api/zipdeploy"
$filePath = "C:\Temp\books.zip"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST -InFile $filePath -ContentType "multipart/form-data"

另请参见相关信息。

不确定这是否有帮助。。。我在这里写了一篇关于上传到kudu应用程序的文章:我不得不将-Method参数从PUT改为POST,但除此之外,您提供的链接中的示例起了作用。谢谢你的帮助。奇怪的是,当我使用Invoke WebRequest时,如果我使用了无效凭据,并且在提供正确凭据时传递了200状态码,但仍然没有上载文件,它会给我一个401。我想我可能把你搞糊涂了。我给你指出那个例子只是为了证明它的正确性。该示例的其余部分使用/zip API,这不适合一般部署。所以你真的需要使用/api/zipdeploy api,这是一个帖子,但只需改变你的身份验证方式即可。@Whiskytangofextrot我编辑了我的答案,以获得使用zipdeploy的完整示例。@David_Ebbo我以为你不是有意让我在我的解决方案中实际使用ZipAPI和zipdeploy。但是谢谢你的补充说明。@whiskytangofoxtrot很酷,请确认一下!有些人一直在使用zip API进行部署,这不是一个好的选择。