Asp.Net core不同于以往的asp.net,它不仅仅可以寄宿在IIS上,还可以寄宿到windows后台服务中,或者Kestrel中。不过本次篇幅不讲解寄宿方式,而是来聊下asp.net core基本启动部署的基础知识。

访问方式

asp.net core 包含有http和https两种方式模式,开发模式下会有开发证书供给https协议使用。

我们在部署的过程中,默认http访问请求会跳转到https访问,如果不想启用https,只需要在Startup文件中,删除app.UseHttpsRedirection()即可。

启动配置项

无论我们是新建MVC模版,还是WebAPI模版,我们的asp.net core的启动模式都是一样的。只是带不带View和resetfull的规范约束的区别。

asp.net core 提供了两种方式修改我们需要监听的URL:

  1. 配置文件Properties.lanuchSettings.json
  2. 后台代码Program.cs或其它注入位置

默认情况下,asp.net core默认会以localhost做为端口监听范围,这种情况下,只有使用localhost才能访问我们的服务。

配置文件如下所示:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:51340",
      "sslPort": 44332
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/MartixService",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "myproject": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/MartixService",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

从配置文件中我们可以看到,主要有三种方式寄宿:IIS,IIS Express,Project

IIS:部署到IIS时,会用到的配置项。

IIS Express:开发环境下,使用IIS Express调试时,会用到的配置项。

Project:开发环境下,直接启动项目编译后的exe时,会用到的配置项。

部分节点说明:

sslPort:表示启用https时访问的端口地址
commandName:表示启动的寄宿进程名
launchBrowser:是否启动浏览器
launchUrl:启动的默认路由地址,服务启动后默认跳转路由地址
applicationUrl:启动的URL地址,服务启动时会引用该配置
ASPNETCORE_ENVIRONMENT:表示asp.net运行环境,Development表示开发环境 ASPNETCORE_ENVIRONMENT中的Development的使用主要可以用于开发模式下的一些额外处理,如异常处理。
具体代码如下:


    //开发环境下,注入异常处理模块
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

服务监听有几种方式:

  1. 使用0.0.0.0,监听本地IP4所有地址。如:http://0.0.0.0:5000
  2. 使用*,监听本地IP6所有地址。如:http://*:5000
  3. 使用固定IP地址,监听本机地址。如:http://127.0.0.1:5000
  4. 监听本地地址。如:http://localhost:5000

默认情况下是监听localhost地址。

以上配置项,我们在开发模式下,通常都可以正常生效,当我们发布程序后,直接运行启动程序,我们会发现无论怎么修改配置项,始终是监听localhost本地地址。这是因为,我们发布的程序已经不是开发环境下了,这种情况下我们就需要通过后台代码来设置。

后台代码设置监听

后台代码设置URL也很简单,只需要在程序启动的时候,通过WebBuilder调用UseUrls方法,即可将启动的URL配置进去。上代码:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls("http://0.0.0.0:5000", "https://0.0.0.0:5001");
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseKestrel();
                });

UseKestrel表示使用Kestrel服务器,也可以不写。

以上方式配置完成后,你用微软的Edge浏览器请求web api时,可能会出现网络无法访问的情况!这种情况下,可以直接打开F12启动调试模式,查看网络通信情况。

网络返回 200 0K,但是没有数据返回!

继续看,我们会发现,Edge浏览器有做访问限制。

在局域网环境下,我们使用其它浏览器(包括IE浏览器)尝试,都可以正常访问,基本可以确定是Edge浏览器访问权限设置问题。

下面先附上谷歌浏览器访问的情况:

解决Edge浏览器无法访问的问题

根据前面的内容,我们已经确定是浏览器的问题,那么针对这个问题要如何解决呢?

首先看到错误提示CONSOLE21301: serviceWorker.getRegistrations 由于 ms-appx-web://microsoft.microsoftedge/assets/errorpages/dnserror.html?ErrorStatus=0x800C0005&NetworkStatusSupported=1 中的不安全上下文或主机限制而被拒绝。

是因为Edge浏览器做了ip访问的限制,我们可以通过解除该限制,让浏览器正常访问。

具体方法如下:

先打开PowerShell,获取Edge浏览器的app id。

  1. PowerShell中输入命令:Get-StartApps,找到Microsoft Edge以及其AppID。本机版本是:Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge
  2. 以管理员身份运行cmd,输入命令:CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe

CheckNetIsolation LoopbackExempt 用法:

   CheckNetIsolation LoopbackExempt [operation] [-n=] [-p=]
      操作列表:
          -a  -  向环回免除列表中添加 AppContainer 或程序包系列。
          -d  -  从环回免除列表中删除 AppContainer 或程序包系列。
          -c  -  清除环回免除的 AppContainer 和程序包系列的列表。
          -s  -  显示环回免除的 AppContainer 和程序包系列的列表。

      参数列表:
          -n= - AppContainer 名称或程序包系列名称。
          -p= - AppContainer 或程序包系列安全标识符(SID)。
          -?  - 显示 LoopbackExempt 模块的此帮助消息。

执行结果:

我们在用Edge浏览器重新输入我们之前输入的URL,此次访问,就可以正常获取数据了。 如下所示:

起初以为是asp.net core的寄宿问题,经过调查最终才发现,原来都是Edge惹的祸!!

启动报错Unable to configure HTTPS endpoint. No server certificate was specified

因为.net core默认是使用https协议,使用Kestrel web服务器没安装证书就会报错。所以只需要打开cmd命令行,执行以下命令就可以安装开发测试证书。

打开cmd命令,执行dotnet dev-certs https --trust

重新编译和重启站点即可。


本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/asp.net-core-%E5%9F%BA%E7%A1%80-%E9%99%84%E5%B8%A6%E8%A7%A3%E5%86%B3Edge%E6%B5%8F%E8%A7%88%E5%99%A8IP%E5%9C%B0%E5%9D%80%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E9%97%AE%E9%A2%98.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系