Есть ли способ программно определить фактический IP-адрес, используемый для конечной точки в Azure DevFabric? - PullRequest
1 голос
/ 15 июля 2011

Я размещаю приложение IIS в структуре разработки Azure.

Когда приложение развертывается в эмуляторе вычислений Azure, создается временное приложение IIS, которое прослушивает порт около 5100. Входящие запросы ототкрытая конечная точка перенаправляется на этот порт.

Однако создается впечатление, что структура разработки Azure не всегда использует открытый порт, объявленный в конфигурации проекта.Так, например, наше приложение должно предоставлять общедоступный порт 80 - но когда я запускаю его, это почти всегда порт 81, но иногда порт 82 и так далее.

Так что я могу убедиться, что URL-адреса, созданные в моем приложении, правильные, я хотел бы знать, что это за внешний порт.на Request.Url.Port, так как это номер порта временного приложения - обычно 5100. RoleEnvironment.CurrentRoleInstance.InstanceEndpoints, также не работает, так как он также возвращает порты, как видно с сервера, 5100 и последующие.

Ответы [ 4 ]

1 голос
/ 18 июля 2011

Понял это с помощью Reflector для просмотра csrun.exe.

Кажется, ключом к этому является SDK DLL Microsoft.ServiceHost.Tools.DevelopmentFabric, в частности методы FabricClient.GetServiceDeployments() и FabricClient.GetServiceInformation(). Итак:

using System; using Microsoft.ServiceHosting.Tools.DevelopmentFabric;</p> <pre><code>class Program { static void Main(string[] args) { FabricClient client = FabricClient.CreateFabricClient(); foreach (string tenantName in client.GetServiceDeployments()) { var information = client.GetServiceInformation(tenantName); foreach (var item in information) { Console.WriteLine(string.Format("{0} {1} {2} {3}", item.ContractName, item.InterfaceName, item.UrlSpecification, item.Vip)); } } Console.ReadLine(); } }

То, что я ищу, возвращается как item.Vip.

Обратите внимание, очевидно, что это будет работать только в структуре разработки ... но это то, что я искал здесь, в любом случае.

0 голосов
/ 17 апреля 2014

Мне не удалось заставить сборку dev fabric работать на меня (похоже, API изменился), поэтому я прибег к анализу вывода «csrun / status», чтобы найти IP-адрес данного имени роли. Вот некоторый код для получения IP, но вам придется проделать небольшую дополнительную работу, чтобы захватить порты.

public static string GetEmulatorIPAddress(string roleName)
    {
        var psi = new ProcessStartInfo();
        psi.FileName = @"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe";
        psi.Arguments = "/status";
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.RedirectStandardInput = true;
        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;

        StringBuilder sb = new StringBuilder();

        DataReceivedEventHandler errorHandler = (object sender, DataReceivedEventArgs e) =>
            {

            };

        string lastIPAddress = null;
        string foundIPAddress = null;

        DataReceivedEventHandler dataHandler = (object sender, DataReceivedEventArgs e) =>
        {
            string line = e.Data;
            if (line != null && foundIPAddress == null)
            {
                if (line.StartsWith("EndPoint: http://"))
                {
                    int ipStart = line.IndexOf("://") + "://".Length;
                    int ipEnd = line.IndexOf(":", ipStart);
                    lastIPAddress = line.Substring(ipStart, ipEnd - ipStart);
                }

                if (line.Trim() == roleName)
                {
                    foundIPAddress = lastIPAddress;
                }
            }
        };

        Process p = new Process();
        p.StartInfo = psi;
        p.ErrorDataReceived += errorHandler;
        p.OutputDataReceived += dataHandler;
        p.EnableRaisingEvents = true;
        p.Start();
        p.BeginOutputReadLine();
        p.BeginErrorReadLine();

        p.WaitForExit();

        return foundIPAddress;
    }
0 голосов
/ 18 июля 2011

Я думаю, что причина "неправильного" порта, такого как 81/82 и т. Д., В том, что требуемый порт занят.

Возможно, у вас есть какое-то другое приложение, слушающее порт 80, поэтому оно никогда не доступно,Кроме того, я несколько раз видел, как вычислительный экземпляр Azure в эмуляторе не завершается достаточно быстро, поэтому, если вы запускаете новый экземпляр, он получает следующий порт и т. Д. Если я его убью, подождите немного и запустите снова - он получит желаемый результат.port.

Это никогда не должно быть проблемой на производстве, поэтому, вероятно, он не раскрывается через API.А во время тестирования просто убедитесь, что у вас нет конфликтов с другими приложениями, и что вы дадите некоторое время, чтобы аккуратно завершить вычисление заметок и освободить порты.

0 голосов
/ 18 июля 2011

Вы пытались использовать

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints

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

Надеюсь, это поможет ...

...