c# - owinstartup - owin tibia
¿Cómo puede un método de inicio OWIN obtener la URL base del sitio web? (3)
¿Cómo puede un método de inicio OWIN obtener la URL base del sitio web?
Estoy tratando de escribir un código que funcione cuando se realiza la depuración con IISExpress, pruebas de unidad con alojamiento propio y bajo IIS.
Cuando se auto hospeda, puedo encontrar esta información en IAppBuilder.Properties ["host.Addresses"] pero no está allí cuando se ejecuta con IISExpress (no he revisado IIS).
Para cualquier persona debajo de vNext, intente esto:
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();
});
}
Si no está en vnext, vi esta respuesta que no me funcionó en vNext / dnx: https://.com/a/24747658/486028
Path.GetDirectoryName (Assembly.GetExecutingAssembly (). GetName (). CodeBase)
Debajo de dnx, este es solo el juego de la carpeta que contiene el tiempo de ejecución .dnx pero podría funcionar en otros contextos
Por favor, no votes más esta publicación. Esta no es una respuesta aceptada. Mantengo este post como elemento educativo para ilustrar que no debe seguir el camino que proporcioné. Es fácil ver cómo esta respuesta podría haber sido una solución para un ojo no entrenado.
(EDITAR: 10/6/2016)
Bien, entonces la conversación debajo de esta publicación no me ayudó a entender por qué me equivoqué. Así que les pregunté a mis amigos, compañeros de trabajo y finalmente recibí una buena respuesta de la comunidad local de la que formo parte para explicar más la conversación y por qué esta respuesta no fue suficiente. Se mencionó que la siguiente información NO responde a la solicitud de inicio de la aplicación de la URL base, sino que responde cómo recuperar la recuperación de la URL base de la aplicación solicitada mediante el manejo de solicitudes. La diferencia es que el manejo de la solicitud obtiene la URL base en cada solicitud; mientras que la obtención de la URL base desde la aplicación de inicio ocurre solo una vez y mantiene el valor de la aplicación solicitada solo cuando la aplicación comienza.
Honestamente, no he visto ni visto ningún tipo de documentación que le permita recuperar la URL base fuera del esquema de manejo de solicitudes actual. Tampoco estoy seguro de si es posible incluso en el estado actual de la pila .NET. Así que de nuevo, me disculpo por no señalar esto y confundirme sobre la solución.
Para aquellos de ustedes que aún quieran usar la solución alternativa para obtener la url base de una aplicación solicitada (que puede ser de la aplicación de inicio ... o algún otro tipo de aplicación externa), y no les importa buscarla por solicitud, y no importa qué punto más adelante en el tiempo en que se recuperará la URL base, la solución a continuación responde eso.
(Solución original)
Aquí hay un buen artículo que explica el uso de la canalización de middleware de Owin:
http://blog.2mas.xyz/owin-middleware/
Puede usar app.Run que acepte un contexto, o app.Uso que acepte un contexto, y luego que sea de tipo Func (obteniendo el siguiente paso en la tubería).
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 es esencialmente el contenedor de la solicitud entrante, es de tipo IOwinRequest. Más información se encuentra aquí: IOwinRequest Interface
La propiedad Uri de IOwinRequest es de tipo System.Uri, por lo que puede ver qué tipo de propiedades (como host, puerto, url absoluta, variables de consulta, etc.) que se detallan en Uri se detallan aquí: Clase Uri
[EDITAR en respuesta al comentario]
Si realmente no crees ese contexto. La solicitud está disponible en el inicio, revisa este flujo:
IOwinContext , que "envuelve el diccionario del entorno OWIN y proporciona accesores fuertemente tipados", que tiene una propiedad llamada IOwinRequest , que "Obtiene un envoltorio que expone las propiedades específicas de la solicitud". Es de tipo Microsoft.Owin.IOwinRequest , que esencialmente tiene la propiedad Uri
System.Web.VirtualPathUtility.ToAbsolute("~")