web-dev-qa-db-ja.com

HttpRequestをHttpRequestBaseオブジェクトに変換するにはどうすればよいですか?

私の問題はこれの反対です: どうすればHttpRequestBaseをHttpRequestオブジェクトに変換できますか?

ASP.NET MVCアプリケーションには、HttpRequestBaseを引数として受け取る多くのコントローラーで使用されるメソッドがあります。

ここで、アクションではない別のメソッドからメソッドを呼び出す必要があります(nhibernateインターセプターです)。この2番目のメソッドでは、HttpRequest。であるHttpContext.Current.Requestにアクセスできますが、HttpRequestBaseにキャストできません(名前付けのために可能性があると思いました...)。

誰かがこのクラスがどのような関係にあるのか、どのように問題を解決できるのかを知っていますか?ありがとうございました。

71

HttpRequestHttpRequestWrapperにラップする必要があります。

var wrapper = new HttpRequestWrapper(httpRequest);

HttpRequestWrapperHttpRequestBaseから継承します。

117
Jamie Dixon

新しいインスタンスを作成する必要のない代替ソリューション:

var httpRequestBase = httpRequest.RequestContext.HttpContext.Request;

これをMVC 5でテストしました。

17
S.Serpooshan

次の拡張メソッドが便利だと思います。

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

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

使用法:

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

私のアプリケーションでは、HttpRequestBaseへのアクセスを必要とするいくつかの異なる場所からの呼び出しがありました。この一連の拡張メソッドを作成して、いくつかの異なるHttp型からHttpRequestBaseに変換し、リクエストへのアクセスが必要なときにアプリケーションを介してインターフェイスメソッドとクラスメソッドの基本型としてHttpRequestBaseを使用しました。

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

私はこれらの拡張機能を構築するのに役立ついくつかのSO答えに出会いました:

0
jwatts1980