Бизнес-класс не может ссылаться на HttpContext

#c#

#c#

Вопрос:

У меня есть бизнес-уровень, настроенный как другой проект C # в моем решении, мне нужно вызвать HttpContext, но независимо от того, что я пытаюсь, я не могу заставить его правильно ссылаться.

Я безуспешно пытался заставить Visual Studio подобрать необходимую ссылку, и я также попытался поместить ссылку на System.Веб вручную, но, похоже, это не работает.

Я также заметил, что сессия также не найдена.

Ниже приведен фрагмент кода, который я использовал

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace BussinessLayer
{
    class UserPermissions
    {
        public void redirectToLogin()
        {

            if (Session["user"] == null)
            {
                HttpContext.
                if (HttpContext.Current.Request.Cookies["userName"] == null)
                {
                    HttpContext.Current.Response.Redirect("/login.aspx");
                }

            }
        }
    }
}
  

Кто-нибудь знает, почему HttpContext или Session не найдены?

Комментарии:

1. Когда вы говорите «ссылка», вы имеете в виду, что получаете ошибку компилятора? Или HttpContext.Current возвращается как null?

Ответ №1:

Это связано с таргетингом на профиль клиента .NET 4. Вы сможете исправить это, перенацелив свой проект на полную .NET Framework 4.

Ответ №2:

HttpContext.Current не подходит для делового уровня, вместо этого вы можете использовать HttpContextBase

     public static class HttpContextHelper {
    private static object lockObj = new object();
    private static HttpContextBase mockHttpContext;

    /// <summary>
    /// Access the HttpContext using the Abstractions.
    /// </summary>
    public static HttpContextBase Current {
        get {
            lock (lockObj) {
                if (mockHttpContext == null amp;amp; HttpContext.Current != null) {
                    return new HttpContextWrapper(HttpContext.Current);
                }
            }

            return mockHttpContext;
        }

        set {
            lock (lockObj) {
                mockHttpContext = value;
            }
        }
    }
}
  

Ответ №3:

Вам нужно ссылаться System.Web.dll который можно найти в GAC (мой VS2010 не показывает его в «Ссылках на .NET», поэтому мне пришлось добавить его вручную).

Также, если вы разделяете бизнес-уровень, может быть разумно сделать его более независимым, более слабо связанным.

Ответ №4:

Вам действительно, по-настоящему, честно не нужно ссылаться HttpContext на свой бизнес-уровень. Если вы это сделаете, то это больше не бизнес-уровень. Это часть уровня представления с жестко запрограммированной зависимостью от механизма представления.

Любое значение, необходимое из HttpContext , должно быть передано объекту бизнес-уровня при вызове уровнем представления.