วิธีการระบุพอร์ตที่แอปพลิเคชัน ASP.NET Core โฮสต์อยู่


197

เมื่อใช้WebHostBuilderในจุดMainเข้าใช้งานฉันจะระบุพอร์ตที่เชื่อมกับได้อย่างไร

โดยค่าเริ่มต้นจะใช้ 5,000

โปรดทราบว่าคำถามนี้เฉพาะกับ ASP.NET Core API ใหม่ (ปัจจุบันอยู่ใน 1.0.0-RC2)


10
ตรวจสอบlaunchSettings.jsonจากPropertiesโฟลเดอร์ launchUrlคุณสามารถเปลี่ยนพอร์ตในส่วน
Oleg

@Oleg ฉันมีการตั้งค่า IIS ที่เกี่ยวข้องบางอย่างเหลืออยู่จากเทมเพลตโครงการของ RC1 พวกเขาไม่มีผลใด ๆ
Drew Noakes

หนึ่งสามารถใช้hosting.json(ดูคำตอบ ) ซึ่งถูกใช้โดยค่าเริ่มต้นใน RC1 และหนึ่งต้องการเพียงแค่เพิ่ม.AddJsonFile("hosting.json", optional: true)(ดูที่นี่ )
Oleg

1
การใช้สแต็กการกำหนดค่าดูเหมือนจะดีกว่าการพึ่งพากลไกเฉพาะ VS อย่างยิ่ง (launchSettings.json)
Kévin Chalet

@DrewNoakes: ฉันต่อท้ายคำตอบเก่าของฉันด้วยการปรับปรุง 2ส่วน มันอธิบายการเปลี่ยนแปลงบางอย่างของการเปลี่ยนพอร์ตเริ่มต้นและการใช้งานhosting.jsonหรือบรรทัดคำสั่งสำหรับการกำหนดค่าของการผูก
Oleg

คำตอบ:


244

ใน ASP.NET Core 3.1 มี 4 วิธีหลักในการระบุพอร์ตแบบกำหนดเอง:

  • การใช้อาร์กิวเมนต์บรรทัดคำสั่งโดยเริ่มต้นแอ็พพลิเคชัน. NET ของคุณด้วย--urls=[url]:
dotnet run --urls=http://localhost:5001/
  • การใช้appsettings.jsonโดยการเพิ่มUrlsโหนด:
{
  "Urls": "http://localhost:5001"
}
  • ASPNETCORE_URLS=http://localhost:5001/การใช้ตัวแปรสภาพแวดล้อมด้วย
  • ใช้UseUrls()ถ้าคุณชอบทำมันโดยทางโปรแกรม:
public static class Program
{
    public static void Main(string[] args) =>
        CreateHostBuilder(args).Build().Run();

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(builder =>
            {
                builder.UseStartup<Startup>();
                builder.UseUrls("http://localhost:5001/");
            });
}

หรือหากคุณยังคงใช้ตัวสร้างเว็บโฮสต์แทนตัวสร้างโฮสต์ทั่วไป:

public class Program
{
    public static void Main(string[] args) =>
        new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseUrls("http://localhost:5001/")
            .Build()
            .Run();
}

40
การใช้ URL คงที่โดยตรงในรหัสไม่ใช่ตัวเลือกที่ดีที่สุดในความคิดของฉัน
Oleg

3
ทดสอบสิ่งนี้และใช้งานได้ดีขอบคุณ @Oleg คุณช่วยอธิบายคำตอบว่าคุณต้องการไฟล์ config ไหม? มันอาจจะดีถ้ามีสิ่งนี้ในไฟล์ปรับแต่ง
Drew Noakes

4
@Oleg อาจจะ แต่การใช้UseUrlsเป็นแนวทางที่ทีม ASP.NET แนะนำให้ใช้สำหรับการโฮสต์ด้วยตนเอง (ค่าตัวเองนั้นไม่จำเป็นต้องเป็นรหัสที่ชัดเจน) ที่กล่าวว่าฉันปรับปรุงคำตอบของฉันที่จะพูดถึงวิธีที่คุณสามารถทำได้โดยใช้เครื่องมือสร้างการกำหนดค่า
Kévin Chalet

1
@Pinpoint: ผมโพสต์คำตอบเก่าhosting.jsonที่หนึ่งสามารถหาวิธีการเปลี่ยนพอร์ตการใช้ สิ่งเดียวที่ต้องทำคือบังคับให้อ่านข้อมูลใน RC2 (ดูประกาศ )
Oleg

2
คุณจะต้องมีแพ็คเกจต่อไปนี้:using Microsoft.Extensions.Configuration.CommandLine;
ผู้เรียน

89

คุณสามารถแทรกส่วน Kestrel ในไฟล์ asp.net core 2.1+ appsettings.json

  "Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://0.0.0.0:5002"
      }
    }
  },

3
ขอบคุณสิ่งที่ฉันต้องการ :-) ดีกว่า UseUrls () รายละเอียดเพิ่มเติม: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…
KTCO

7
dotnet publishนี้ใช้งานได้จริงกับไบนารีที่สร้างผ่าน
rsenna

นี่ไม่ใช่การกำหนดพอร์ต Kestrel ถูกผูกเข้ากับ IIS (พร็อกซี)แทนที่จะเป็นพอร์ตที่แอพโฮสต์อยู่ใน IIS หรือไม่
user12345

@ user12345 ใน IIS hosting Kestrel ใช้การรวมพอร์ตแบบไดนามิก
Menxin

1
ยังทำงานร่วมกับ netcore 3.0 ที่ทำงานบนเว็บ api จาก exe, briliant !!!
vidriduch

58

ติดตามคำตอบเพื่อช่วยให้ทุกคนทำสิ่งนี้ด้วยการรวม VS docker ฉันต้องการเปลี่ยนเป็นพอร์ต 8080 เพื่อให้ทำงานได้โดยใช้สภาพแวดล้อม "ยืดหยุ่น" ใน google appengine

คุณจะต้องใช้สิ่งต่อไปนี้ใน Dockerfile ของคุณ:

ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080

และคุณจะต้องแก้ไขพอร์ตใน docker-compose.yml เช่นกัน:

    ports:
      - "8080"

3
ขอขอบคุณเราสามารถตั้งค่าตัวแปรในคำสั่ง windows ให้แสดงผลในลักษณะเดียวกัน: set ASPNETCORE_URLS = http: // *: 8080
Pavel Biryukov

1
มันไม่ทำงานสำหรับฉัน คุณแน่ใจหรือว่านี่คือทั้งหมดที่คุณแก้ไข คุณต้องการทำอะไรเป็นพิเศษกับภาพของคุณใน afterwords หรืออะไรก็ตามกับ docker
Steve

มันนานมากแล้วที่มันอาจจะเปลี่ยนไป แต่ถ้าฉันจำได้ว่านั่นคือทั้งหมดที่ฉันต้องทำ
Casey

ใน VS Code คุณสามารถเพิ่ม "ASPNETCORE_URLS": "http: // +: 8080" บนส่วน "env" ของ launch.json เพื่อแทนที่การตั้งค่าอื่น ๆ
gorlok

31

ทางเลือกอื่นคือใช้hosting.jsonในรูทของโครงการ

{
  "urls": "http://localhost:60000"
}

และจากนั้นค่ะ Program.cs

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", true)
        .Build();

    var host = new WebHostBuilder()
        .UseKestrel(options => options.AddServerHeader = false)
        .UseConfiguration(config)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

7
สิ่งนี้ไม่ได้ผลสำหรับฉัน ตอนนี้ server.urls เป็น URL และตรวจสอบให้แน่ใจว่าคุณได้เพิ่มรายการใน project.json "publishOptions": {"รวม": ["appsettings.json", "web.config", "wwwroot", "hosting.json"]},
Manish Jain

3
ฉันอัปเดตคำตอบของเขาด้วยคุณสมบัติที่ถูกต้องurls- ขอบคุณ @ManishJain
TetraDev

30

คุณสามารถระบุ URL การโฮสต์โดยไม่มีการเปลี่ยนแปลงแอปของคุณ

สร้างProperties/launchSettings.jsonไฟล์ในไดเรกทอรีโครงการของคุณและเติมลงในบางสิ่งเช่นนี้:

{
  "profiles": {
    "MyApp1-Dev": {
        "commandName": "Project",
        "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "applicationUrl": "http://localhost:5001/"
    }
  }
}

dotnet runคำสั่งควรเลือกlaunchSettings.jsonไฟล์ของคุณและจะแสดงในคอนโซล:

C:\ProjectPath [master ≡]
λ  dotnet run
Using launch settings from C:\ProjectPath\Properties\launchSettings.json...
Hosting environment: Development
Content root path: C:\ProjectPath
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down. 

รายละเอียดเพิ่มเติม: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environment


1
ทำงานใน appSettings.json ด้วยหรือไม่
เปาโล

ไม่ต้องเข้า[ProjectRoot]/Properties/launchSettings.jsonแต่สิ่งที่สวยงามคือมันทำงานได้โดยไม่ต้องผูกปม
ไคม์เอลียาห์

5
สิ่งนี้มีประโยชน์เฉพาะในระหว่างการพัฒนาไม่ทำงานกับไบนารี ในการใช้งานdotnet runคุณจำเป็นต้องเข้าถึงซอร์สโค้ด
rsenna

18

หากใช้งาน dotnet run

dotnet run --urls="http://localhost:5001"

คำตอบที่สมบูรณ์แบบ! ทำงานในนักเทียบท่า แทนที่ "localhost" ด้วย "0.0.0.0" เท่านั้น
AndrewPt

17

ข้างต้น. net core 2.2 วิธีการสนับสนุนหลัก args กับ WebHost.CreateDefaultBuilder (args)

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

คุณสามารถสร้างโครงการของคุณและไปbinเรียกใช้คำสั่งเช่นนี้

dotnet <yours>.dll --urls=http://localhost:5001

หรือมีหลาย URL

dotnet <yours>.dll --urls="http://localhost:5001,https://localhost:5002"

คุณสามารถใช้ 'dotnet run --urls = 0.0.0.0:5001 ' ได้ง่ายในไดเรกทอรีโครงการ
oudi

12

เมื่อโฮสต์ในคอนเทนเนอร์นักเทียบท่า (เวอร์ชั่นสำหรับ linux สำหรับฉัน) คุณอาจได้รับข้อความ 'ปฏิเสธการเชื่อมต่อ' ในกรณีดังกล่าวคุณสามารถใช้ที่อยู่ IP 0.0.0.0ซึ่งหมายถึง "ที่อยู่ IP ทั้งหมดในเครื่องนี้" แทนlocalhost loopback เพื่อแก้ไขการส่งต่อพอร์ต

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseUrls("http://0.0.0.0:5000/")
            .Build();

        host.Run();
    }
}

5

หรือคุณสามารถระบุพอร์ตโดยเรียกใช้แอปผ่านบรรทัดคำสั่ง

เพียงแค่เรียกใช้คำสั่ง:

dotnet run --server.urls http://localhost:5001

หมายเหตุ: ที่ 5001 คือพอร์ตที่คุณต้องการรัน


5

บน. Net Core 3.1 เพียงทำตาม Microsoft Doc ว่ามันค่อนข้างง่าย: kestrel-aspnetcore-3.1

เพื่อสรุป:

  1. เพิ่มส่วน ConfigureServices ด้านล่างเพื่อ CreateDefaultBuilder เมื่อProgram.cs:

    // using Microsoft.Extensions.DependencyInjection;
    
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((context, services) =>
            {
                services.Configure<KestrelServerOptions>(
                    context.Configuration.GetSection("Kestrel"));
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
  2. เพิ่มการกำหนดค่าพื้นฐานด้านล่างลงในappsettings.jsonไฟล์ (ตัวเลือกการกำหนดค่าเพิ่มเติมในบทความของ Microsoft):

    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://0.0.0.0:5002"
            }
        }
    }
  3. เปิด CMD หรือคอนโซลในโฟลเดอร์โครงการเผยแพร่ / Debug / Release ไบนารีของคุณและเรียกใช้:

    dotnet YourProject.dll
  4. เพลิดเพลินกับการสำรวจไซต์ / API ของคุณได้ที่http: // localhost: 5002


3

ไปที่ Properties / launchSettings.json และค้นหาชื่อแอปของคุณและค้นหา appUrl คุณจะเห็นมันกำลังรัน localhost: 5000 เปลี่ยนเป็นอะไรก็ได้ที่คุณต้องการ แล้วเรียกใช้ dotnet run ...... hurray


0

ฉันแก้ไขปัญหาพอร์ตใน Net core 3.1 โดยใช้สิ่งต่อไปนี้

ใน Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
        .ConfigureWebHost(x => x.UseUrls("https://localhost:4000", "http://localhost:4001"))
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}

คุณสามารถเข้าถึงแอปพลิเคชันโดยใช้

http://localhost:4000

https://localhost:4001
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.