Как метод запуска OWIN может получить базовый URL-адрес веб-сайта?
Как метод запуска OWIN может получить базовый URL-адрес веб-сайта?
Я пытаюсь написать код, который будет работать при отладке с IISExpress, модульном тестировании с самостоятельным размещением и под IIS.
При самостоятельном размещении я могу найти эту информацию в IAppBuilder.Properties["host.Addresses"], но ее нет при работе в IISExpress (не проверял IIS).
3 ответа
Пожалуйста, не отрицайте это больше сообщение. Это не принятый ответ. Я сохраняю этот пост в качестве учебного пособия, чтобы показать, как не идти по пути, который я указал Легко увидеть, как этот ответ мог стать решением для неопытного глаза.
(РЕДАКТИРОВАНИЕ: 06.10.2016)
Итак, разговор ниже этого поста не помог мне понять, почему я ошибался. Поэтому я попросил друзей, коллег и, наконец, получил хороший ответ от местного сообщества, в котором я участвую, чтобы объяснить больше разговора и почему этого ответа было недостаточно. Было упомянуто, что ниже НЕ отвечает на запрос запуска приложения базового URL, он отвечает, как получить выборку базового URL запрашиваемого приложения, используя обработку запроса. Разница в том, что обработка запросов извлекает базовый URL при каждом запросе; тогда как выборка базового URL из запускаемого приложения происходит только один раз и сохраняет значение запрошенного приложения только при запуске приложения.
Честно говоря, я не видел и не просматривал какую-либо документацию, которая позволяет вам получить базовый URL за пределами текущей схемы обработки запросов. Я также не уверен, возможно ли это вообще в текущем состоянии стека.NET. Итак, еще раз, я прошу прощения за то, что не указал на это и не запутался в решении.
Для тех из вас, кто все еще хочет использовать обходной путь при извлечении базового URL-адреса из запрошенного приложения (которое может быть из запускаемого приложения... или какого-либо другого вида внешнего приложения), и не возражает извлекать его по запросу, и не имеет значения, в какой момент времени будет получен базовый URL-адрес, решение, приведенное ниже, отвечает на это.
(Оригинальное решение)
Вот хорошая статья, которая объясняет использование промежуточного программного обеспечения Owin:
http://blog.2mas.xyz/owin-middleware/
Вы можете использовать app.Run, который принимает контекст, или app.Use, который принимает контекст, и next, который имеет тип 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
[РЕДАКТИРОВАТЬ в ответ на комментарий]
Если вы действительно не верите, что context.Request доступен при запуске, проверьте этот поток:
IOwinContext, который "оборачивает словарь среды OWIN и предоставляет строго типизированные методы доступа", который имеет свойство IOwinRequest, которое "получает оболочку, предоставляющую специфичные для запроса свойства". Это тип Microsoft.Owin.IOwinRequest, который по существу имеет свойство Uri
Для тех, кто под 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: /questions/36590032/kak-vyi-razreshaete-virtualnyij-put-k-fajlu-na-hoste-owin/36590055#36590055
Path.GetDirectoryName (Assembly.GetExecutingAssembly (). GetName (). CodeBase)
Под dnx это просто игра, в которой содержится папка, содержащая среду выполнения.dnx, но она может работать в других контекстах.