Ответ 1
System.Web.VirtualPathUtility.ToAbsolute("~")
Как метод запуска OWIN может получить базовый URL-адрес веб-сайта?
Я пытаюсь написать код, который будет работать при отладке с помощью IISExpress, модульное тестирование с самообслуживанием и под IIS.
При самообслуживании я могу найти эту информацию в IAppBuilder.Properties [ "host.Addresses" ], но ее там нет при работе под IISExpress (не проверял IIS).
System.Web.VirtualPathUtility.ToAbsolute("~")
Для любого пользователя, находящегося под 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, но может работать в других контекстах
Пожалуйста, не уменьшайте это сообщение больше. Это не принятый ответ. Я сохраняю этот пост как образовательный, чтобы проиллюстрировать, чтобы не идти по пути, который я предоставил. Легко понять, как этот ответ мог быть решением неподготовленного глаза.
(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