web-dev-qa-db-fra.com

Comment une méthode de démarrage OWIN peut-elle obtenir l'URL de base du site Web?

Comment une méthode de démarrage OWIN peut-elle obtenir l'URL de base du site Web?

J'essaie d'écrire du code qui fonctionnera lors du débogage avec IISExpress, des tests unitaires avec hébergement autonome et sous IIS.

Lorsque je m'héberge moi-même, je peux trouver ces informations dans IAppBuilder.Properties ["Host.Addresses"], mais elles ne le sont pas lors de l'exécution sous IISExpress (je n'ai pas vérifié IIS).

16
John Vottero
System.Web.VirtualPathUtility.ToAbsolute("~")
3
SergeyA

Pour ceux qui utilisent vNext, essayez ceci:

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 vous n'êtes pas sous vnext, j'ai vu cette réponse qui ne fonctionnait pas pour moi sous vNext/dnx: https://stackoverflow.com/a/24747658/486028

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

Sous dnx ce jeu vient de me le dossier contenant le runtime .dnx mais pourrait fonctionner dans d'autres contextes 

0
brendanrichards

S'il vous plaît ne plus downvote ce post. Ce n'est pas une réponse acceptée. Je garde ce poste à titre éducatif pour illustrer mon propos afin de ne pas suivre le chemin que j'ai fourni. Il est facile de voir en quoi cette réponse aurait pu être une solution pour un œil non averti. 

(EDIT: 10/6/2016)

Ok, donc la conversation en dessous de ce post ne m'aidait pas à comprendre pourquoi j'avais tort. J'ai donc demandé à des amis, à des collègues de travail et j'ai finalement reçu une bonne réponse de la communauté locale à laquelle je participe pour expliquer davantage la conversation et pourquoi cette réponse n'était pas suffisante. Il a été mentionné que ce qui suit NE répond PAS à la demande de démarrage de l’URL de base de l’application, il explique comment récupérer l’extrait d’URL de base de l’application demandée à l’aide du traitement de la demande. La différence est que la gestion de la requête extrait l'URL de base à chaque requête. alors que l'extraction de l'URL de base depuis l'application de démarrage n'a lieu qu'une seule fois et conserve la valeur de l'application demandée uniquement au démarrage de l'application.

Honnêtement, je n'ai ni vu ni consulté aucun type de documentation vous permettant de récupérer l'URL de base en dehors du schéma actuel de traitement des demandes. Je ne suis pas sûr non plus que ce soit possible dans l'état actuel de la pile .NET. Encore une fois, je m'excuse de ne pas l'avoir signalé et d'avoir été dérouté par la solution.

Pour ceux d'entre vous qui veulent toujours utiliser la solution de contournement pour récupérer l'URL de base à partir d'une application demandée (qui peut être à partir de l'application de démarrage .. ou d'un autre type d'application externe), et que cela ne vous dérange pas de le récupérer à la demande, et Peu importe à quel moment l'URL de base sera récupérée, la solution ci-dessous répond à cela.

(Solution d'origine)

Voici un article de Nice qui explique l'utilisation du pipeline de middleware Owin:

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

Vous pouvez utiliser app.Run qui accepte un contexte, ou app.Use qui accepte un contexte, puis qui est de type Func (obtenir l'étape suivante dans le pipeline).

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 est essentiellement le wrapper de la requête entrante, il est de type IOwinRequest. Plus d'informations se trouvent ici: Interface IOwinRequest

La propriété Uri de IOwinRequest est de type System.Uri. Vous pouvez ainsi afficher le type de propriétés (telles que hôte, port, URL absolue, variables de requête, etc.) fournies avec Uri détaillées ici: Uri Class

[EDIT en réponse au commentaire]

Si vous ne croyez vraiment pas que ce contexte est disponible au démarrage, consultez le flux suivant:

IOwinContext , qui "encapsule le dictionnaire de l’environnement OWIN et fournit des accesseurs fortement typés", qui possède une propriété appelée IOwinRequest , qui "Obtient un encapsuleur exposant les propriétés spécifiques à la requête". C'est de type Microsoft.Owin.IOwinRequest , qui a essentiellement la propriété Uri

0
sksallaj