.NET WCF хранит данные сеанса без постоянства или чистой реализации - PullRequest
0 голосов
/ 13 января 2011

Я написал службу WCF, которая предоставляет большое количество методов, каждый из которых в основном представляет собой запрос к базе данных.Однако существует несколько баз данных, поэтому теперь каждый метод имеет первый аргумент, являющийся именем базы данных.

На стороне клиента один сеанс использует только одну базу данных, поэтому я не хочу передавать имябаза данных каждый раз, когда вызов службы.В идеале я хочу сначала отправить имя базы данных в службу, которая хранит его в памяти для всех будущих запросов.Проблема в том, что мой клиент написан на классическом ASP, и поэтому я использую basicHttpBinding, поэтому нет постоянства при обращениях к серверу.

Мой вопрос сейчас таков: есть ли другой способ, а если нет, то какЯ реализовал это красиво, поэтому у меня нет имени базы данных в каждой сигнатуре метода.

Конечно, я могу использовать что-то вроде шаблона Command и создавать для каждого вызова объект, содержащий необходимые данные (включая имя базы данных).используя наследование), но это приведет к множеству классов (на сервере и на клиенте).Другой вариант - использовать словарь, но тогда мой серверный метод не указывает свои аргументы, что усложняет его поддержку.Я думал об использовании отражения, но это кажется мне немного излишним ...

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 01 декабря 2014

Если требуемый клиент запускает ASP, я бы, вероятно, выбрал предлагаемое решение AspNetSession. Однако, если вы не можете полагаться на AspNetSessions, тогда вы можете использовать HTTP-заголовки для отправки этой информации при каждом вызове. При первом вызове, когда база данных определена, сервер берет информацию о том, какую базу данных взять, непосредственно из параметра метода и сохраняет ее в заголовке HTTP.

OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader(HEADER_NAME, NAMESPACE, yourDbName));

В классическом ASP должен быть способ получить эту информацию, но я не эксперт в этом.

http://www.w3schools.com/asp/coll_servervariables.asp

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

на сервере, который вы прочитали, выполнив

int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(HEADER_NAME, NAMESPACE)
string yourDbName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(headerIndex);

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

0 голосов
/ 13 января 2011

Вы можете попытаться использовать этот пример для создания сеанса на основе файлов cookie - то же самое поддерживается в ASMX. Ваша служба сможет получить доступ к сеансу ASP.NET, но для этого требуется совместимость с AspNet. Вы также можете попробовать объединить его с пользовательским IInstanceProvider и создать настраиваемое управление сеансом, управляемое cookie.

0 голосов
/ 13 января 2011

Вы можете положиться на этот ответ , речь идет о включении ASP.NET-подобного сеанса.

0 голосов
/ 13 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...