Рекомендации по проектированию архитектуры веб-приложений ASP.NET

ранее мое веб-приложение ASP.NET подключается к базе данных напрямую с помощью ADO.NET. Теперь я хочу изменить его на 3 уровня: уровень ASP.NET, уровень среднего веб-сервиса и уровень внутренней базы данных. Я думаю, что есть преимущество в том, что я могу абстрагировать источник данных на переднем уровне ASP.NET, слабо связать и снизить потенциальные риски безопасности, чтобы внешнее открытое веб-приложение ASP.Net могло иметь прямой доступ к базе данных и т. Д.

По сравнению с двухуровневой архитектурой с трехслойной архитектурой я столкнулся с двумя основными проблемами.

  1. Дополнительный средний уровень веб-сервисов потребует больше трафика, например ASP.NET не взаимодействует с базой данных напрямую, но разговаривает с веб-службой, и веб-служба обращается к базе данных, что потребует больше трафика. Будет ли это узким местом? Какие-либо общие советы по решению этой проблемы, если это узкое место?

  2. Поскольку ASP.NET не может подключиться к базе данных, но может подключиться к веб-службе, он не может легко получить объект DataSet / DataTable. Становится трудно представить данные табличной формы элементам управления с привязкой к данным. Есть ли идеи упростить кодирование уровня представления в ASP.NET?

С уважением,
Джордж


person George2    schedule 09.02.2009    source источник


Ответы (3)


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

Ты:

  • У вас есть срочные потребности, связанные с безопасностью, которые требуют отключения веб-интерфейса от сервера базы данных (нет, это не гипотетическая «держу пари, что это будет более безопасно», но очевидные, конкретные проблемы безопасности, которые нельзя решить, если учесть, что Права БД, которые вы предоставляете своему приложению ASP.NET)

  • Ожидаете, что в какой-то момент в будущем (возможно, неоднократно) полностью поменяют уровень данных, и, таким образом, необходимо оградить кодовую базу веб-сайтов от радикальных изменений БД?

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

person Rex M    schedule 09.02.2009
comment
+1 - если вы можете обойтись без архитектуры, приложите эти усилия, чтобы улучшить свой интерфейс, а не добавлять слои - person Brandon; 09.02.2009
comment
+1 - Абсолютно согласен с этим. Похоже, что OP просто вызовет у него головную боль. - person nickohrn; 09.02.2009
comment
Рекс, что ты имеешь в виду? Возникла острая необходимость в безопасности для полного отключения сервера базы данных от веб-интерфейса? сказать другими словами? - person George2; 09.02.2009
comment
@ George2 отредактировал вопрос следующим образом: Есть ли срочные потребности, связанные с безопасностью, которые требуют лучшего отключения веб-интерфейса от сервера базы данных? - person Rex M; 09.02.2009
comment
Привет, routeNpingme, nickohrn и nailitdown. Я думаю, что 3 яруса - это более слабосвязанная модель. И слабо связан с базой данных. Разве слабосвязанная не лучше? - person George2; 09.02.2009
comment
Спасибо, Рекс. И безопасность базы данных, и изменение базы данных требуются как высокий приоритет. Итак, я считаю, что нужна трехуровневая архитектура. По двум вопросам, которые я упомянул в своем сообщении, есть какие-либо идеи, комментарии или рекомендуемые чтения? :-) - person George2; 09.02.2009
comment
@ george2 слабосвязанная не лучше, просто другая. Если у вас есть доказательства дыры в вашем соединении с БД, используйте рекомендацию @ rally25rs для разметки DMZ. Честно говоря, использование веб-сервисов для абстрагирования уровня данных в целях защиты будущего - обычно не очень хорошая идея. - person Rex M; 09.02.2009
comment
Я не понимаю, что вы, ребята, имеете в виду, макет DMZ? - person George2; 09.02.2009
comment
Ответ @ george2 @ rally25rs описывает базовую схему сети для отделения вашей базы данных от вашего веб-интерфейса путем размещения сервера веб-сервисов посередине и брандмауэра между ними. - person Rex M; 09.02.2009

Что касается вашего вопроса № 2 - вы наверняка можете вернуть DataSet из веб-службы. http://tinyurl.com/ah58xc

Однако, возможно, лучшим вариантом будет просто рефакторинг вашего приложения, вместо того, чтобы делать его многоуровневым. Например, выделите «доступ к данным» в отдельный проект библиотеки классов, на который вы ссылаетесь из своего проекта ASP.NET. Это может сделать вещи более организованными и, возможно, выполнить часть того, что вы хотите сделать с многоуровневой архитектурой.

Между прочим, самая большая опасность при создании нескольких уровней, когда они вам не обязательно нужны, заключается в том, что вы в конечном итоге создаете «прокси-код» из-за отсутствия лучшего термина. То есть методы, которые служат только для вызова «настоящих» внутренних методов с теми же параметрами. Сначала это кажется лучше, потому что у вас есть чистое разделение слоев, но в будущем возникают проблемы с обслуживанием, потому что, например, чтобы добавить параметр к методу, вы должны добавить его 3 раза (серверная часть, прокси-уровень и презентационный слой).

person Brandon    schedule 09.02.2009
comment
Я согласен с неправильным использованием прокси-кода. Я работал в ужасной арке. в нем было 6 слоев, 4 из которых только что прошли через параметры! Если средний уровень ничего не делает (например, логику шины), не беспокойтесь о его создании. - person CodingWithSpike; 09.02.2009
comment
Привет, routeNpingme, я прочитал рекомендуемый вами документ. Меня беспокоит, что в ближайшем будущем может появиться какое-нибудь приложение на основе Java для доступа к веб-службам. Может ли Java распознать тип .Net DataSet? Я сомневаюсь. Любые комментарии? - person George2; 09.02.2009
comment
routeNpingme, новый комментарий. В будущем я могу представить кеш-сервер и файловый сервер, и я хочу использовать веб-службу среднего уровня для прозрачности различий в источниках данных для уровня ASP.Net. Любые комментарии? Образует ли такой дизайн смысл? - person George2; 09.02.2009
comment
Привет, rally25rs, я думаю, SOA должна добавить больше слоев, SOA - зло? :-) - person George2; 09.02.2009
comment
George2, я думал только о том, что вы можете добавить компонент SOA для других приложений, не создавая слоев (создавайте веб-сервисы в своем существующем приложении asp.net). Всегда старайтесь использовать как можно меньше слоев, пока это не станет абсолютно необходимым. - person Brandon; 09.02.2009
comment
Еще одно замечание: если вы еще не пробовали создать многослойное приложение, сначала сделайте небольшое одноразовое приложение в качестве пилотного. Не пытайтесь сделать свое реальное приложение с первого раза. В конечном итоге это решение зависит от вас, поэтому вам действительно нужно самому понимать последствия. :) - person Brandon; 09.02.2009

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

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

{internet} -> | DMZ | -> Веб-сервер -> | Локальная сеть с брандмауэром | -> Сервер приложений -> Сервер базы данных

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

Если вы собираетесь использовать WCF для связи между серверами, я бы предложил использовать что-то вроде двоичной сериализации по TCP вместо SOAP. Это должно работать лучше (не стесняйтесь настроить быстрый тест). Я сам не пробовал, но WCF может сериализовать набор данных или таблицу по сети. См. здесь.

person CodingWithSpike    schedule 09.02.2009
comment
Спасибо rally25rs! 1. Что означает DMZ? 2. В будущем я могу представить кеш-сервер и файловый сервер, и я хочу использовать веб-службу среднего уровня для прозрачности различий в источниках данных для уровня ASP.Net. Любые комментарии? Образует ли такой дизайн смысл? - person George2; 09.02.2009