试图了解CreateDefaultBuilder

时间:2018-05-25 05:27:39

标签: c# asp.net-core dependency-injection identityserver4

我是编写C#Api的新手,正在看IdentityServer4 QuickStart1 我看到QuickstartIdentityServer模块有

using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace QuickstartIdentityServer
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.Title = "IdentityServer";

            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

API已经

using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace Api
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.Title = "API";

            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

我无法理解BuildWebHost实际上做了什么以及为什么我需要它在两个独立的进程中运行才能使用我的客户端进程连接到API

我看到BuildWebHost包含

WebHost.CreateDefaultBuilder

查看Microsoft.AspNetCore(来自元数据)我看到它是一个包含方法声明的静态类

public static IWebHostBuilder CreateDefaultBuilder(string[] args);

因此该方法的实际代码必须在Microsoft.AspNetCore.Dll

为什么需要在IdentityServer4和Api中运行?

1 个答案:

答案 0 :(得分:2)

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

这是启动和运行ASP.NET Core应用程序所必需的默认代码。这基本上做的是创建具有通常默认值的Web主机,配置Startup类,然后构建Web主机。然后,Web主机就是实际为您的Web应用程序提供服务的东西。

您可以查看CreateDefaultBuilder allow_url_fopen,但根据您的实际问题判断,这对您没什么帮助。

  

为什么需要在IdentityServer4和Api中运行?

Identity Server示例在此处执行的操作是在单独的服务器上具有Identity Server和AP​​I。从技术上讲,这不是必需的,您可以在同一个应用程序中托管它们。但是,实际上,在一些中心位置部署Identity Server的可能性要大得多,然后您可能拥有多个其他服务器--API,客户端,无论什么 - 将服务器用作外部身份验证提供程序。

因此,他们正在创建单独的Web主机,因为它们是单独的Web应用程序。它们是在单独的.NET项目中创建的独立Web应用程序。

如果您仔细阅读at the implementation,您会注意到他们确实为此创建了单独的项目。单独的ASP.NET核心项目意味着单独的Web应用程序,每个都是单独托管的。