2016-09-27 3 views
4

У меня есть простой .net ядра Web API с одним действием:Подключитесь к .net ядра самодостаточно Web API

[Route("[action]")] 
    public class APIController : Controller 
    { 
     // GET api/values 
     [HttpGet] 
     public string Ping() 
     { 
      return DateTime.Now.ToString(); 
     } 
    } 

Если я бегу это через Dotnet перспективе я

Hosting environment: Production 
Content root path: C:\Users\xxx\Documents\Visual Studio 2015\Projects\SelfHostTest\src\SelfHostTest 
Now listening on: http://localhost:5000 
Application started. Press Ctrl+C to shut down. 

Going в браузере и ввод в http://localhost:5000/ping приводит к успешному возврату текущего времени. Однако, отправляющийся на удаленный компьютер (та же ЛВС) и пытающийся получить доступ к службе через http://odin:5000/ping, приводит к ошибке 404. (Odin - это имя машины, на которой запущен веб-api в консоли через прогон dotnet).

Брандмауэры сервера (и клиента!) Отключены. Я могу выполнить ping «odin» успешно.

Любые идеи, какой простой шаг мне здесь не хватает. Я пробовал это дома и на работе без успеха.

+0

Что произойдет, если вы попытаетесь с IP-адресом «odin»? Пример: 192.111.11.2:5000? Может быть [это] (http://stackoverflow.com/questions/12460562/consuming-asp-net-web-api-service-from-other-computer-in-lan) может вам помочь. –

+0

То же самое попробовал 192.168.1.2, как на сервере, так и на клиенте. 127.0.0.1 работает на сервере, хотя! – Calanus

ответ

6

Я предполагаю, что проблема не в вашем контроллере, это в program.cs. Вы должны изменить конструкцию вашего WebHost

var host = new WebHostBuilder() 
.UseKestrel() 
.UseContentRoot(Directory.GetCurrentDirectory()) 
.UseUrls("http://localhost:5000", "http://odin:5000", "http://192.168.1.2:5000") 
.UseIISIntegration() 
.UseStartup<Startup>() 
.Build(); 

Если вы не добавить строку UseUrls, пустельга не собирается слушать за пределами локального хоста. Это имеет смысл, потому что в нормальной ситуации Kestrel будет сидеть за обратным прокси-сервером, таким как IIS или NGNIX, и не требует привязки к внешним URL-адресам.

+0

Спасибо - это работает! Угадайте, что такая конфигурация действительно должна быть в конфигурационном файле какого-то типа, хотя ...? – Calanus

+2

Либо это, либо вы можете использовать специальную переменную окружения ASPNETCORE_URLS. Тем не менее, я бы не хотел слушать прямо с Kestrel. Лучше всего сидеть за чем-то другим. – Feasoron

+0

Кроме того, вы можете использовать '.UseUrls (« http: // *: 5000 »)' вместо этого, чтобы принимать входящие запросы из порта '5000'! – Wingjam

0

Существует более точный способ использования нескольких IP-адресов на локальном компьютере. Подключение UDP сокет и читать его локальную конечную точку:

string localIP; 
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) 
{ 
    socket.Connect("8.8.8.8", 65530); 
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; 
    localIP = endPoint.Address.ToString(); 
} 
0

Вы можете просто сделать следующее, чтобы создать свой WebHost, это позволит удаленное подключение к пустельга.

var host = WebHost.CreateDefaultBuilder(args) 
       .UseUrls("http://0.0.0.0:80") 
       .UseStartup<Startup>() 
       .Build(); 

После используя следующий код, который я до сих пор не удалось получить доступ к своему API удаленно, мне пришлось отключить сетевые адаптеры, созданные Docker в панели управления окна (Control Panel \ Сеть и Интернет \ Сетевые подключения)

0

Другим способом решения этой проблемы является редактирование файла "applicationhost.config". в папке проекта -> .vs (скрытая папка) -> config открыть файл «applicationhost.config». Под сайтами разделе сайта название = «название проекта» в узле Привязки добавить еще связывания и изменения Localhost с «IP/Domain» на «bindingInformation», как это:

<site name="project_name" id="2"> 
    <application path="/" applicationPool="Clr4IntegratedAppPool"> 
    <virtualDirectory path="/" physicalPath="D:\Projects\project_directory" /> 
    </application> 
    <bindings> 
    <binding protocol="http" bindingInformation="*:5000:localhost" /> 
    <binding protocol="http" bindingInformation="*:5000:192.168.1.2" /> 
    <binding protocol="http" bindingInformation="*:5000:odin" /> 
    </bindings> 
</site> 

запомнить Visual Studio должен быть запущен Администратор.

Смежные вопросы