C# 如何在Ubuntu上托管/发布我的.Net核心WebAPI?

C# 如何在Ubuntu上托管/发布我的.Net核心WebAPI?,c#,.net,asp.net-core,asp.net-web-api2,publish,C#,.net,Asp.net Core,Asp.net Web Api2,Publish,我正在学习.NETCore 我使用ASP.NETMVC开发了WebApplication,因为它可以在本地IIS上安装和运行 在Ubuntu和Linux中托管/发布.Net核心WebApi的类似方式是什么,而不是在特定端口(如5000)上运行 docker在这方面有帮助吗?如果是,那么我如何使用它 是否可以在没有docker的情况下托管/发布?没有Docker,我如何主持/发布 我还阅读了下面的链接并实现了所有步骤。 在上面的链接中,我无法确定访问webapi的url是什么?Asp.NET核心

我正在学习.NETCore

我使用ASP.NETMVC开发了WebApplication,因为它可以在本地IIS上安装和运行

在Ubuntu和Linux中托管/发布.Net核心WebApi的类似方式是什么,而不是在特定端口(如5000)上运行

docker在这方面有帮助吗?如果是,那么我如何使用它

是否可以在没有docker的情况下托管/发布?没有Docker,我如何主持/发布

我还阅读了下面的链接并实现了所有步骤。


在上面的链接中,我无法确定访问webapi的url是什么?

Asp.NET核心应用程序使用名为Kestrel的跨平台应用程序web服务器。您可以直接使用Kestrel运行应用程序(例如,使用
dotnet run
——在开发过程中非常有用),但不建议将Kestrel直接暴露给外部世界,因此在生产环境中,在Windows上运行时,您可以将IIS放在应用程序前面,在Linux上运行时,您可以将其放在nginx前面。您可以在这里找到nginx配置示例:

您可以像这样指定url/端口(在“Program.cs”文件中):

publicstaticvoidmain(字符串[]args){
var host=new WebHostBuilder()
.UseKestrel()
.useURL(“http://192.168.0.0:8080")
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.Build();
host.Run();
}
将“192.168.0.0”替换为方法中的实际ip或url

在项目目录中,只需打开终端/控制台窗口并运行“dotnet run”

确保它显示“正在收听:192.168.0.0:8080”(或您输入的url/ip)


上面的示例假设您正在为您的

使用Startup,正如@Pawel所指出的,托管.NET Core Web API或ASP.NET Core应用程序的推荐方法是使用Kestrel,这是内置于dotnet Core工具中的Web服务器。出于开发目的,您不需要另一个Web服务器来启动和测试api

您不需要DOCKER来承载Web应用程序/ API,但应该考虑它用于生产托管,因为它是一种干净、快速的自动化发布和隔离进程的方法。 对于Docker,流程结构是相同的——Docker只是承载和管理流程。您可以让Kestrel在一个Docker容器中运行API,让Nginx(在另一个容器中或安装在基本操作系统上)向它转发调用

在没有Docker的情况下托管API
  • 在Ubuntu上,使用Nginx(或Apache)提供公共HTTPS,并将其配置为将请求转发到Kestrel服务器,该服务器通常运行在端口5000上。如果您的服务器正在运行防火墙,请不要公开端口5000,而是打开该计算机上的端口443(HTTPS)。您引用的文章介绍了如何设置Nginx。如前所述,不需要仅启动和测试Web API
  • Kestrel很快,但非常简单-例如,它不支持HTTPS(您应该将其用于公共API,因为您需要身份验证,没有HTTPS您无法安全地进行身份验证。在Kestrel上使用Nginx/Apache还有许多其他原因-安全性、负载平衡、反向代理功能等
让API在开发设置中运行的简单步骤

  • 确保在project.json中定义了适当的运行时

    "runtimes": {
       "win7-x64": {},
       "win81-x64": {},
       "ubuntu.14.04-x64": {},
       "debian.8-x64": {}
    }
    
  • 确保您的project.json在
    buildOptions
    部分中定义了
    “emittentrypoint”:true
  • 为您将要部署到的平台构建您的项目:
    dotnet Build-r ubuntu.14.04-x64——构建概要文件发布版
  • 为平台发布您的项目:
    dotnetpublish-rbuntu.14.04-x64——配置发布-o./bin/Release/Publish
使用我展示的命令行为Ubuntu构建和发布你的应用程序-我在VS2015更新3中尝试过,但在为正确的运行时构建时遇到了问题

  • 将Publish文件夹中的文件复制到Ubuntu VM或服务器,并添加应用程序需要运行的任何文件,例如
    appsettings.json
  • 确保在Linux计算机上安装了适当的.NET核心框架
  • 打开一个终端窗口,
    sudo-i
    以获得管理员权限,
    cd
    到放置二进制文件并使用运行api的文件夹:
    dotnet MyWebApi.dll
    ,其中MyWebApi.dll是构建过程的主要输出
在这一点上,Kestrel应该从通常的消息开始,说明它正在监听哪个端口(比如5000)。如果它是无头服务器,您应该能够使用curl调用您的Web API:

    curl http://localhost:5000/whatever/your/api/needs/here
如果Ubuntu框有GUI(Gnome等),你应该能够通过浏览器连接到你的api

如果您的Ubuntu服务器没有运行防火墙,您应该能够通过浏览器从同一网络上的另一台机器连接到Web API:

    http://<linux-ip-address>:5000/whatever/your/api/needs/here
http://:5000/which/your/api/needs/here
您可以通过在终端窗口中键入
IP addr show
来获取Ubuntu服务器的IP地址

笔记
  • 管理防火墙取决于Linux发行版。如果服务器是公用的,则必须运行一个并使用它关闭对Kestrel服务的访问
  • 设置Docker更复杂,这里要添加的内容太多。请另外提问,我将记录我所做的工作
  • 请注意,当您在Windows上的IIS下运行时,会发生完全相同的情况:IIS将请求转发到端口5000上的Kestrel或您指定的任何位置。通常会配置IIS(通过发布生成的web.config文件)在需要时启动Kestrel并保持其运行。您可以在Windows上使用
    dotnet MyWebApi.dll
    手动启动应用程序,并将IIS配置为转发给它
  • 在学习时,正如我所描述的那样跑步是很好的,但对于生产来说,你需要
        http://<linux-ip-address>:5000/whatever/your/api/needs/here