将ASP.NET 5(ASP.NET Core)应用程序部署到Azure的问题

时间:2016-02-19 22:24:11

标签: c# azure asp.net-core azure-web-sites

我在ASP.NET 5(CoreCLR)上有一个应用程序,我尝试将其发布到Microsoft Azure。我使用免费的Web App(不是VDS)

我正在使用Visual Studio 2015 Publish->Microsoft Azurethis instructions发布应用。

但是当我发布它并尝试打开时,我看到只是不间断加载空页面。我启用日志记录并从Azure查看日志(stdout.log),只有:

'"dnx.exe"' is not recognized as an internal or external command,

可操作程序或批处理文件。

我也尝试用git做Continiusly publishing。在推送过程中,它开始恢复软件包并因错误no disk space available而失败。

有没有办法将ASP.NET 5应用程序发布到Azure Web App?

3 个答案:

答案 0 :(得分:5)

简答

  

但是当我发布它并尝试打开时,我看到只是不间断加载空页面。

当我们的应用程序无法使用应用程序发布运行时(dnx.exe)时会发生这种情况。

讨论

有几种方法可以将ASP.NET Core rc1应用程序发布到Azure Web App。其中包括使用Git进行持续部署以及使用Visual Studio进行发布。发布您的存储库内容以获取特定帮助。

该示例是一个ASP.NET Core rc1应用程序,通过GitHub持续部署部署到Azure Web App。这些是至关重要的文件。

app/
    wwwroot/
        web.config
    project.json
    startup.cs
.deployment           <-- optional: if your app is not in the repo root 
global.json           <-- optional: if you need dnxcore50 support

app / wwwroot / web.config

添加HttpPlatformHandler。将其配置为将所有请求转发到DNX进程。换句话说,告诉Azure Web应用程序使用DNX。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" 
           path="*" verb="*" 
           modules="httpPlatformHandler" 
           resourceType="Unspecified"/>
    </handlers>
    <httpPlatform 
         processPath="%DNX_PATH%" 
         arguments="%DNX_ARGS%" 
         stdoutLogEnabled="false" 
         startupTimeLimit="3600"/>
  </system.webServer>
</configuration>

app / project.json

在Kestrel服务器上包含依赖项。设置将启动Kestrel的web命令。使用dnx451作为目标框架。请参阅下文,了解定位dnxCore50的其他工作。

{
  "dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
  },

  "frameworks": {
    "dnx451": { }
  }
}

应用/ Startup.cs

包含Configure方法。这个添加了一个非常简单的响应处理程序

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;

namespace WebNotWar
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(
                    "Hello from a minimal ASP.NET Core rc1 Web App.");
            });
        }
    }
}

.deployment (可选)

如果您的应用不在存储库根目录中,请告知Azure Web App哪个目录包含该应用。

[config]
project =  app/

global.json (可选)

如果您希望定位.NET Core,请告诉Azure我们要定位它。添加此文件后,我们可以使用dnx451替换(或补充) project.json 中的dnxCore50条目。

{
  "sdk": {
    "version": "1.0.0-rc1-update1",
    "runtime": "coreclr",
    "architecture": "x64"
  }
}

答案 1 :(得分:3)

首先,是的,您可以愉快地在Azure上运行ASP.Net 5核心应用程序,但有一些问题。

知道为什么它从Visual Studio本身发布时不起作用(为什么他发布了我听到你问的答案......),但这里有一些东西看看;

  • 尝试在本地运行IIS(而不是红隼) - 只是为了查看是否存在问题。例如,您需要一个带有一些设置的Web.config,您需要startup.cs中的app.UseIISPlatformHandler。
  • 查看您的global.json文件。从Visual Studio发布时不应该重要但是正确设置它不会有什么坏处。你可以这样做:

{
  "sdk": {
    "version": "1.0.0-rc1-update1",
    "runtime": "coreclr",
    "architecture": "x64"
  }
}

关于持续发布 - 这是免费和共享网站的已知问题,而且花费了我几个小时。基本上,当您通过此机制进行部署并指定corecelr时,整个运行时将从Nuget重新安装,并占用近1GB(免费和共享站点的容量)。添加一些NPM包,你已超出限制,嘿,你无法部署。 @shanselman最近在他的一个播客上讨论过它。实际上并不是占用所有空间的运行时二进制文件,但由于我们处于构建模式,因此也安装了所有文档XML文件,因为Nuget不知道您不在开发环境中,而且它们非常庞大。 现在,如果您想在 free shared 站点上使用连续发布,最简单的答案是在project.json中包含完整的运行时并设置{{ 1}}使用完整的CLR而不是coreclr。非常令人沮丧。

答案 2 :(得分:0)

我遇到了同样的问题。这answer解决了这个问题。

使用asp.net核心模板创建新项目时,global.json文件是我的API项目的一部分,但它也在Solution Items文件夹中引用。发布到Azure API应用程序时,部署了两个global.json文件:

  1. /approot/global.json
  2. /approot/src/MyAPI/global.json
  3. 我将global.json文件移出项目文件夹到解决方案根目录,然后将引用重新添加回Solution Items文件夹。

    部署后,只部署了/approot/global.json文件,解决了问题。