Wie konvertiere ich eine HttpRequest in ein HttpRequestBase-Objekt?

76

Mein Problem ist das Gegenteil davon: Wie konvertiere ich eine HttpRequestBase in ein HttpRequest-Objekt?

In meiner ASP.NET MVC-Anwendung habe ich eine Methode, die von vielen Controllern verwendet wird, die eine HttpRequestBase als Argument erhalten.

Jetzt muss ich diese Methode von einer anderen Methode aus aufrufen, die keine Aktion ist (es ist ein nhibernate Interceptor). In dieser zweiten Methode konnte ich auf HttpContext.Current.Request zugreifen, das ist eine HttpRequest, und ich kann sie nicht in HttpRequestBase umwandeln (ich dachte, es wäre aufgrund der Benennung möglich ...).

Weiß jemand in welcher Beziehung diese Klassen sind und wie kann ich mein Problem lösen? Vielen Dank.

Daniele Armanasco
quelle

Antworten:

127

Sie werden Ihre einwickeln wollen HttpRequestin HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

Das HttpRequestWrappererbt von HttpRequestBase.

Jamie Dixon
quelle
9
könnte hilfreich seinnew HttpRequestWrapper(HttpContext.Current.Request)
Yasser Shaikh
22

Dies ist eine weitere Lösung, für die keine neue Instanz erstellt werden muss:

var httpRequestBase = myHttpRequest.RequestContext.HttpContext.Request;
S. Serpooshan
quelle
1

In meiner Anwendung kamen Anrufe von verschiedenen Stellen, die Zugriff auf die HttpRequestBase benötigten. Ich habe diesen Satz von Erweiterungsmethoden erstellt, um verschiedene Http-Typen abzurufen und in eine HttpRequestBase zu konvertieren, und dann HttpRequestBase als Basistyp für Schnittstellen- und Klassenmethoden über die Anwendung verwendet, wenn ich Zugriff auf die Anforderung benötigte.

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);
    }
}

Ich bin auf mehrere SO-Antworten gestoßen, die mir beim Erstellen dieser Erweiterungen geholfen haben:

jwatts1980
quelle
0

Ich finde die folgenden Erweiterungsmethoden nützlich:

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

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

Verwendung:

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