Как метод OWIN Startup получает базовый URL-адрес веб-сайта?

Как метод запуска OWIN может получить базовый URL-адрес веб-сайта?

Я пытаюсь написать код, который будет работать при отладке с помощью IISExpress, модульное тестирование с самообслуживанием и под IIS.

При самообслуживании я могу найти эту информацию в IAppBuilder.Properties [ "host.Addresses" ], но ее там нет при работе под IISExpress (не проверял IIS).

Ответы

Ответ 1

System.Web.VirtualPathUtility.ToAbsolute("~")

Ответ 2

Для любого пользователя, находящегося под vNext, попробуйте следующее:

public void Configure(IApplicationBuilder app)
        {
            app.Use(async (ctx, next) =>
            {
                var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
                var realPath = hostingEnvironment.WebRootPath + ctx.Request.Path.Value;

                // do something with the file

                await next();
            });

        }

Если вы не находитесь под vnext, я видел этот ответ, который не работал у меня в vNext/dnx: fooobar.com/questions/210796/...

Path.GetDirectoryName(Assembly.GetExecutingAssembly(). GetName(). CodeBase)

В dnx это просто игра мне в папку, содержащую время выполнения .dnx, но может работать в других контекстах

Ответ 3

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

(EDIT: 10/6/2016)

Хорошо, поэтому разговор ниже этого сообщения не помог мне понять, почему я ошибся. Поэтому я спросил друзей, коллег и, наконец, получил хороший ответ от локального сообщества, что я являюсь частью объяснения беседы больше и почему этого ответа недостаточно. Было упомянуто, что ниже НЕ отвечает на запрос запуска запуска базового URL-адреса, он отвечает на вопрос, как получить выборку базового URL-адреса запрашиваемого приложения, используя обработку запросов. Разница заключается в том, что обработка запроса извлекает базовый URL-адрес при каждом запросе; тогда как получение базового URL-адреса из запускающего приложения происходит только один раз и сохраняет значение запрашиваемого приложения только при запуске приложения.

Я честно не видел и не просматривал какую-либо документацию, которая позволяет вам получить базовый URL-адрес за пределами текущей схемы обработки запросов. Я также не уверен, возможно ли это в текущем состоянии стека .NET. Поэтому снова я извиняюсь за то, что не указал на это и путался с решением.

Для тех из вас, кто по-прежнему хочет использовать обходной путь при извлечении базового URL-адреса из запрошенного приложения (которое может быть из приложения-запуска или какого-либо другого внешнего приложения), и не прочь выбрать его запрос, и не возражает против того, какой момент позже будет получен базовый URL-адрес, ниже приведенное ниже решение.

(исходное решение)

Вот хорошая статья, которая объясняет использование конвейера промежуточного ПО Owin:

http://blog.2mas.xyz/owin-middleware/

Вы можете использовать app.Run, которые принимают контекст, или app.Use, который принимает контекст, и следующий, который имеет тип Func (следующий шаг в конвейере).

public void Configuration(IAppBuilder app)
{
    JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
    //First way using app.Use
    var currentUri1 = "";
    app.Use((context, next) => { 
        currentUri1 = context.Request.Uri.ToString(); //Get base URL
        return next().ContinueWith(task =>
        {
            context.Response.WriteAsync(" FINISHED RETRIEVING CURRENT URL ");
        });
    });

    //Second way using app.Run
    var currentUri2 = "";
    app.Run((context) => { 
        currentUri2 = context.Request.Uri.ToString(); //Get base URL
         var task = context.Response.WriteAsync("Hello world! " + context.Request.Path);
            return task;
    });
}

context.Request - это, по сути, оболочка входящего запроса, это тип IOwinRequest. Дополнительная информация находится здесь: Интерфейс IOwinRequest

Свойство Uri для IOwinRequest имеет тип System.Uri, поэтому вы можете посмотреть, какие свойства (такие как хост, порт, абсолютный URL-адрес, переменные запроса и т.д.), которые поставляются с Uri подробно здесь: Uri Class

[ИЗМЕНИТЬ в ответ на комментарий]

Если вы действительно не верите, что context.Request доступен в процессе запуска, проверьте этот поток:

IOwinContext, который "обертывает словарь среды OWIN и предоставляет строго типизированные аксессоры", который имеет свойство IOwinRequest, который "Получает оболочку, отображающую специфические свойства запроса". Это тип Microsoft.Owin.IOwinRequest, который по существу обладает свойством Uri