Kestrel web sunucusunun localhost olmayan istekleri dinlemesini nasıl sağlayabilirim?


84

C #, asp.net 5, mvc 6 uygulamamı bir Windows 2008 sunucusuna dağıttım. Ateş ettim dnx webve 5000 numaralı bağlantı noktasını dinliyor ve yerel bilgisayardan erişirken iyi çalışıyor.

Yerel ana bilgisayar dışı istekleri dinlemesini nasıl sağlayabilirim?

Not: Bu soru bunun bir kopyası değildir ... hosting.ini aslında .ini formatına sahipken asp.net pre RC1'i ifade eder. Şimdi, JSON ve içinde ne olması gerektiğine dair herhangi bir belge bulamıyorum.

PPS Gerçek çözüm, büyük bir uyarı ile bağlantılı soruya verilen kabul edilmeyen cevapta . Adımlar:

  1. Project.json'unuzu bağlantılı yanıta göre değiştirin.
  2. Projenizi sunucunuzda yayınlayın.
  3. Sunucuda ... \ Approot \ src \ Projeniz klasörüne gidin ve orada bir komut penceresi açın.
  4. Çalıştır dnx web- başarısız olur
  5. Çalıştırmak dnu restore
  6. "Dnu build" komutunu çalıştırın
  7. 'Dnx web` çalıştırın - web sunucusu şimdi iyi başlamalıdır

Not: Bu soruyu destekleyenler için. Modası geçmiş. Çok kötü modası geçmiş!

.NET Core'un önceki sürümlerine uygulandı. Soru ve cevaplar, çerçevenin mevcut sürümleri için kesinlikle geçerli değildir (örn. 2.x, 3.x)



Bağlantılı sorudaki ikinci cevap JSON formatına atıfta bulunur. Senin için de yararlı değil mi?
chue x

@chuex Bunu denedim ve başlangıçta web sunucusunu başlangıçta çöktü. Emin değilim neden. Sonra yaptım dnu restore, ardından web sunucusunu takip ettim dnu buildve dnx webdüzgün bir şekilde başlattım. Neden olduğunu bilmiyorum, ama en azından çalışmasını sağlayabiliyorum. Kesinlikle son sürümden önce ele alınması gereken bir hata var. Şimdilik geçici çözüm budur.
AngryHacker

1
Çözümü yansıtmak için soruyla düzenledim.
AngryHacker

2
Modası geçmiş olmakla ilgili büyük harfleri okudum ama .NET Core 3.1'deki bir web API'si için bile burada cevaplara kesinlikle ihtiyacım vardı. İlk olarak 0.0.0.0:5000'e bağlanmayı denedim ama görünüşe göre IPv6 burada oluyor ve bu yüzden bu işe yaramadı. Bu arada [::]: 5000, harici IPv4 erişimi için de çalışmadı. Şu anda IPv4 / IPv6 standardından çıktığımız için *: 5000'e bağlanma konusunda hiçbir fikrim yoktu. Çok yardımcı oldu!
Jonas

Yanıtlar:


116

Kestrel sunucusu tarafından kullanılan varsayılan yapılandırma dosyası hosting.json. Ad, farklı beta sürümlerinde birçok kez değiştirildi. Şimdi project.jsonaşağıdaki "command"bölümle kullanıyorsanız

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

daha sonra sunucuyu komut satırından başlatırken

dnx web

dosya hosting.jsonokunacaktır. Dosya

{
    "server.urls": "http://0.0.0.0:5000"
}

sunucuyu her IP4 adresinde 5000 dinleyecek şekilde yapılandıracaktır. Konfigürasyon

{
    "server.urls": "http://::5000;http://0.0.0.0:5000"
}

hem IP4 hem de IP6 adresinde 5000 dinlemesi için bilgi verecektir.

Kullanım ASPNET_ENVortamı değişkenine göre veya --config myconfig1.json(veya config=myconfig1.json) kullanımı ile alternatif yapılandırma dosyaları belirtilebilir . Örneğin kullanabilirsiniz

SET ASPNET_ENV=Development

ve hosting.Development.jsonbelirli yapılandırmaya sahip dosya oluşturmak için . Alternatif olarak project.jsonile kullanabilirsiniz

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
    "webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}

ve kullanıma göre sunucuyu başlatın

dnx webProd

Ek olarak dinlemenize ve kaydolmanıza (başlamak için dnx web) izin vermeniz gerekebileceğini hatırlatmalıyım . Güvenlik duvarı ve yeni TCP / HTTP bağlantı noktalarını dinlemenin yerel güvenliği nedeniyle gereklidir. Aşağıdaki gibi bir şey, herkes için 5000 bağlantı noktasının yerel olarak kaydedilmesini ve dinlenmesini sağlamalıdır (IPv4 ve IPv6):

netsh http add iplisten ipaddress=0.0.0.0:5000
netsh http add iplisten ipaddress=::5000
netsh http add urlacl url=http://+:5000/ user=\Everyone

Daha güvenli olmak için, yukarıdaki yapılandırmayı minimum haklar verecek şekilde ayarlayabilirsiniz.

GÜNCELLENDİ: Teşekkürler @BlaneBunderson. Herhangi bir arayüzden herhangi bir IP4 ve IP6 adresini http://*:5000dinlemek için IP adresi (gibi ) yerine * kullanılabilir . Dikkatli olmalı ve bunları kullanmamalı

  • http://*:5000;http://::5000
  • http://::5000;http://*:5000
  • http://*:5000;http://0.0.0.0:5000
  • http://*:5000;http://0.0.0.0:5000

çünkü IP6 adresini ::veya IP4 adresini 0.0.0.0 iki kez kaydetmeyi gerektirecektir .

Duyuruya karşılık gelir

Teknik olarak, "localhost" olmayan herhangi bir ana bilgisayar adı veya geçerli bir IPv4 veya IPv6 adresi, Kestrel'in tüm ağ arabirimlerine bağlanmasına neden olur.

Gelecekte bu davranışın değiştirilebileceğini düşünüyorum. Böylece sadece kullanmayı öneriyoruz *:5000, 0.0.0.0:5000ve ::5000herhangi bir IT adresi kayıt için oluştururlar.

GÜNCELLENMİŞ 2: ASP.NET Core RC2 , varsayılanları yükleme davranışını değiştirir ( duyuruya bakın ). MainAyarları hosting.jsonve komut satırı parametrelerini yüklemek için değişiklik yapmak gerekir . Aşağıda kullanımın bir örneği bulunmaktadır

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

    var host = new WebHostBuilder()
        .UseUrls("http://*:1000", "https://*:1234", "http://0.0.0.0:5000")
        .UseEnvironment("Development")
        .UseConfiguration(config)
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

Yukarıdaki kod kullanımı üç bağlamaları: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"yerine varsayılan olarak kullanım varsayılan bağlantı noktası 5000 varsayılan olarak (tam kullanımı olmak http://localhost:5000). Çağrı .UseConfiguration(config)yapılır sonra .UseUrls . Bu nedenle, hosting.jsonkomut satırından veya komut satırından yüklenen yapılandırma varsayılan seçeneklerin üzerine yazılır. Bir .SetBasePath(Directory.GetCurrentDirectory())satır kaldırma satırı ise hosting.json, uygulama dll'sinin derleneceği aynı dizinden yüklenecektir (örneğin bin\Debug\netcoreapp1.0).

Biri yürütme gibi kullanılabilir

dotnet.exe run --server.urls=http://0.0.0.0:5000

varsayılan ayarların (kimden UseUrls) ve varsa "server.urls"özelliğindeki ayarların üzerine yazmak için hosting.json.

Aynı şekilde, ortam değişkenini ayarlayarak ULR ayarlarının üzerine yazılabilir.

set ASPNETCORE_SERVER.URLS=http://localhost:12541/

ardından uygulamanın varsayılan başlangıcı bağlama için dotnet.exe runkullanacaktır http://localhost:12541/.

Burada HTTPS bağlama kullanımına bir örnek bulabilirsiniz .

AÇIKLAMA: ortam değişkeninin adı değiştirilir ASPNETCORE_SERVER.URLSiçin ASPNETCORE_URLSASP.NET sonraki sürümlerinde (bkz burada ASP.NET Çekirdek 3.1 belgelerine).


1
Ayrıca "server.urls" yerine "server.urls": "http: // *: 5000" kullanabilirsiniz: " 0.0.0.0:5000 " (Şahsen * biraz daha mantıklı olduğunu düşünüyorum.)
Blane Bunderson

@BlaneBunderson: Öneriniz için teşekkürler! Bunun http://*:5000aynı olduğunu http://::5000;http://0.0.0.0:5000ve olmadığını eklemeliyim http://0.0.0.0:5000. Hem IPv4 hem de IPv6 için dinlemeye zorlar. Kullanarak http://*:5000;http://::5000veya ile doğrulayabilirsiniz http://::5000;http://*:5000. İkinci adres kaydedilirken "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Hata -4091 EADDRINUSE adresi zaten kullanımda" hatası alınıyor. Bazı senaryolarda hem IPv4 hem de IPv6 kaydı iyidir, diğer senaryolarda ise iyi değildir. Herhangi bir şekilde, yoldan bahsetmek iyidir.
Oleg

RC2 için mükemmel güncelleme, ayrıntılı açıklama için teşekkürler
Trygve

olmaz .UseStartup<Startup>()geçersiz .UseConfiguration(config)senin "güncelleme 2" örneğinde?
çentikler

bu ortam değişkeninde bir yazım hatası var, bu ASPNETCORE_URLS olmalıdır
nrjohnstone

33

RC2'de project.json dosyasının komutlar bölümü artık kullanılmamaktadır. Henüz Kestrel'in hosting.json dosyasını almasını sağlamadım, ancak yeni WebHostBuilder'ın oluşturulduğu ve yapılandırıldığı Ana uygulamanın bağlantı noktasını programlı olarak ayarlayabilirsiniz. Aşağıdaki örnekte olduğu gibi .UseUrls () yöntemini eklemeniz yeterlidir.

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

        host.Run();
    }

3
Bu çok yardımcı oldu. Bunun .UseUrls("http://*:5000")yerine kullandım ve VirtualBox üzerinde boş Host IP'si ile 5000 portunu ilettim ve sonunda Mac'imden Docker'da barındırılan .NET Core uç noktalarına ulaşabiliyorum. Tatlı!
Mark Larter

RC2'de hosting.json kullanımı hakkında bilgi ve daha ayrıntılı açıklama için Oleg'in yukarıdaki cevabını, özellikle "Güncellenmiş 2"
Trygve

2
1.0.0-preview2-003121, docker görüntüsü için de geçerlidir
linquize

18

Asp.net core 2.1 + kullanıyorsanız, appsettings.json içindeki yapılandırma bölümünü değiştirin.

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

Bu, VS Code veya Mac için Visual Studio'dan çalışırken benim için tutarlı bir şekilde çalıştı. ASPNETCORE_URLSbenim için çalışmadı
JSancho

10

Bir docker kapsayıcısının içine bir ASP.NET Core uygulaması koymaya çalışıyorsanız (bu, yerel ana bilgisayar olmayan adresleri dinlemeye ihtiyaç duyduğum durumdu), bu kullanım senaryosunun sizin için Microsoft tarafından zaten bir araya getirildiğini unutmayın. Tüm ihtişamı https://hub.docker.com/r/microsoft/aspnetcore/ adresinde görebilirsiniz.

Şu anda (v1.0.1), bu sorunu çözmenin ana sihri, kaynak Dockerfile'ın bir url ortam değişkeni ayarı içermesi ve uygulamanın bunu geçersiz kılmaya çalışmamasıdır. (Aslında, kapsayıcıya alınmış bir uygulama, çalışacağı ortam hakkında dahili olarak mümkün olduğunca az iddiada bulunmalıdır.)

ENV ASPNETCORE_URLS http://+:80

Buradaki yıldız işareti yerine artı işaretine dikkat edin. Aslında, bağlantı iyi olduğu sürece cevabımı okurken yukarıdaki dockerhub bağlantısını ziyaret etmenizi öneririm. Versiyon 1.1 hemen köşede ve gelecekte işler tekrar değişebilir.

Kapsayıcıyı çalıştırırken, ortam değişkeni ayarına göre konuk bağlantı noktası 80'i açığa çıkardığınızdan emin olun. Örneğin:

docker run -d -p 8000:80 myapp
curl localhost:8000

1
bu benim kullanım durumumdu ve bağlantı son derece yardımcı oldu. Teşekkür ederim.
Oxymoron

4

İçin AspNetCore 3.1+ sadece dosyasında aşağıdaki satırı ekleyin appsettings.json:

"Urls": "http://*:80"

1
Tıkır tıkır çalışıyor. Çözümlerin neden hosting.jsonişe yaramayacağını bulamıyorum .
Machado

0

Ortam değişkenini ASPNETCORE_URLSolarak ayarlayın http://0.0.0.0:5000/.

Visual Studio'dan çalıştırıyorsanız, ortam değişkenini proje özelliklerinin Hata Ayıkla sekmesinden eklersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.