Вызов контекста БД Entity Framework из службы WCF - PullRequest
0 голосов
/ 08 января 2020

Мы разработали приложение ASP Net MVC, используя шаблон Repository. Мы создаем экземпляр контекста БД, используя класс провайдера контекста, например:

public class ContextProvider

        public static DBEntities GetContext()
        {
            return HttpContext.Current.Items["_EntityContext"] as DBEntities;
        }
    }

Здесь мы проверяем, что вызов DB DBEntities существует только во время существования запроса - мы помещаем экземпляр в Карта сеанса - HttpContext.Current.Items["_EntityContext"] в этом примере.

Мы используем это во всем нашем Asp Net Mvc Проекте следующим образом:

public class TeamRepository
{
    #region Members

    private DBEntities storeDB = null;

    #endregion Members

    #region Constructors

    public TeamRepository()
    {
        storeDB = ContextProvider.GetContext();

    }

    #endregion Constructors

    #region Methods

...

Теперь нам нужно создать службу WCF, чтобы разрешить доступ к некоторым функциям для других поставщиков.

Поскольку все классы репозитория являются частью проекта - они не были исключены из отдельной DLL, которую я создал ссылка на весь проект в моем новом проекте WCF, чтобы я мог использовать уже существующие вызовы методов БД Repository.

Здесь я сталкиваюсь с проблемой, поскольку не могу получить доступ к переменной Session HttpContext.Current.Items["_EntityContext"] - вызов метода publi c stati c DBEntities GetContext() всегда возвращает ноль при вызове из службы WCF.

Я пытался сделать HttpContext.Current доступным в службе WCF av можно получить, поместив

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)] 

в мой класс Service и настроив раздел serviceHostingEnvironment в web.config, который теперь выглядит следующим образом:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://localhost” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

, но без результатов.

Я использую Windows 10.

Знаете ли вы, как я могу получить доступ к HttpContext.Current.Items["_EntityContext"] ... содержащемуся в Asp Net Mvc проекте из моего проекта WCF?

С уважением

1 Ответ

0 голосов
/ 09 января 2020

Проблема решается с помощью следующих шагов: я украсил свою реализацию сервиса атрибутом AspNetCompatibilityRequirements:

[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
   . . .
}

Последнее, что мне нужно было сделать, это то, что WCF не поддерживал несколько заголовков хоста; Мне пришлось жестко подключить конечную точку WCF для прослушивания указанного c имени хоста. В данном случае это включало настройку раздела serviceHostingEnvironment в файле web.config, который теперь выглядит следующим образом:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix=http://services.mydomain.com” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

, а затем добавление еще одного атрибута в класс реализации службы и инициализация сеанса HttpContext.Current.Items:

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
HttpContext.Current.Items["_EntityContext"] = new DBEntities();
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...