web-dev-qa-db-fra.com

Comment convertir une requête HttpRequest en un objet HttpRequestBase?

Mon problème est le contraire de ceci: Comment convertir une HttpRequestBase en un objet HttpRequest?

Dans mon application ASP.NET MVC, une méthode utilisée par de nombreux contrôleurs reçoit un argument HttpRequestBase.

Maintenant, je dois appeler cette méthode depuis une autre méthode, ce n'est pas une action (c'est un intercepteur nhibernate). Dans cette seconde méthode, je pouvais accéder à HttpContext.Current.Request, c'est-à-dire un HttpRequest et je ne peux pas le convertir en HttpRequestBase (je pensais que c'était possible en raison de la désignation ...).

Est-ce que quelqu'un sait dans quelle relation se trouvent ces cours et comment puis-je résoudre mon problème? Merci.

66

Vous voudrez envelopper votre HttpRequest dans un HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

HttpRequestWrapper hérite de HttpRequestBase.

110
Jamie Dixon

Solution alternative qui ne nécessite pas de créer une nouvelle instance:

var httpRequestBase = httpRequest.RequestContext.HttpContext.Request;

J'ai testé cela dans MVC 5.

17
S.Serpooshan

Je trouve les méthodes d'extension suivantes utiles:

    public static HttpContextBase AsBase(this HttpContext context)
    {
        return new HttpContextWrapper(context);
    }

    public static HttpRequestBase AsBase(this HttpRequest context)
    {
        return new HttpRequestWrapper(context);
    }

Usage:

HttpContext.Current.AsBase()
HttpContext.Current.Request.AsBase()
0
rothschild86

Dans mon application, j'avais des appels provenant de plusieurs endroits différents qui nécessitaient un accès à HttpRequestBase. J'ai créé cet ensemble de méthodes d'extension pour obtenir et convertir de différents types Http en une HttpRequestBase, puis j'ai utilisé HttpRequestBase comme type de base pour les méthodes d'interface et de classe via l'application lorsque j'avais besoin d'accéder à la demande.

public static class RequestExtensions
{
    public static HttpRequestBase GetHttpRequestBase(this HttpContext httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentException("Context is null.");
        }

        return httpContext.Request.ToHttpRequestBase();
    }

    public static HttpRequestBase GetHttpRequestBase(this HttpRequestMessage httpRequestMessage)
    {
        if (httpRequestMessage == null)
        {
            throw new ArgumentException("Request message is null.");
        }

        HttpContextWrapper context = null;
        if (httpRequestMessage.Properties.ContainsKey("MS_HttpContext"))
        {
            context = httpRequestMessage.Properties["MS_HttpContext"] as HttpContextWrapper;
        }
        if (context == null)
        {
            throw new ArgumentException("Context is null.");
        }

        return context.Request;
    }

    public static HttpRequestBase GetHttpRequestBase(this HttpApplication httpApplication)
    {
        if (httpApplication == null)
        {
            throw new ArgumentException("Application is null.");
        }

        return httpApplication.Request.ToHttpRequestBase();
    }

    public static HttpRequestBase ToHttpRequestBase(this HttpRequest httpRequest)
    {
        if (httpRequest == null)
        {
            throw new ArgumentException("Request is null.");
        }

        return new HttpRequestWrapper(httpRequest);
    }
}

J'ai rencontré plusieurs SO réponses qui m'ont aidé à créer ces extensions: 

0
jwatts1980