Сеансы WCF с WSHTTPBinding и без безопасности Windows
-
16-10-2019 - |
Вопрос
Мне нужно создать услугу WCF, которая размещена в IIS, использует HTTP Transport и удерживать состояние в памяти сервера. Хотя я знаю, что государственные услуги не являются хорошей идеей, это последнее ограничение необходимо, чтобы услуги работали с устаревшим клиентом.
Моей первой мыслью было сеанс ASP.NET для хранения значений. Я активировал режим совместимости ASP.NET в моем сервисе, который дал мне доступ к HTTPContext, но значения, которые были размещены в объекте сеанса, не сохранялись в памяти. Я предполагаю, что это было потому, что модуль HTTP, который обрабатывает состояние сеанса, был неправильно настроен, но когда я Googling для ответа я столкнулся, сеансы WCF и подумали, что это может быть лучшей идеей для их использования.
Тем не менее, сеансы WCF кажутся тем, что недокументировано, и поместите странный набор предпосылок на услугу, и я не смог найти конфигурацию, которая соответствует моим потребностям: должен быть размещен в IIS, должен использовать HTTP или HTTPS Transport и может В ответ на аутентификацию Windows, потому что клиент и сервер не будут частью одного и того же домена. Я пытаюсь начать использовать это, используя WSHTTPBinding, я слышал, что сеансы WCF требуют либо безопасности, либо надежного сообщения, но: - Использование стандартного привязки и когда серверы не являются частью того же домена, он не работает с «SecurityNegotiationException the Caller не было аутентифицировано исключением службы ». Это довольно логично, так как он использовал безопасность Windows.
Если я отключите безопасность завершить, он не сработает с «контрактом требует сеанса, но привязка« wshttpbinding »не поддерживает его или не настроен должным образом для его поддержки».
Если при предоставлении безопасности отключена безопасность, я включил надежное сообщение, я получаю исключение «Отсутствие проверки привязки, потому что WSHTTPBinding не поддерживает надежные сеансы по сравнению с транспортной безопасностью (HTTPS). Фабрика канала или хост сервиса не может быть открыт. Используйте безопасность сообщений для безопасного надежного обмена сообщениями над http. »
Я попытался обеспечить безопасность транспортного уровня, но, похоже, это не имеет никакого значения для сгенерированной ошибки
Есть ли какая -либо конфигурация, которая может работать для меня? Или я должен просто вернуться к плану использования сеансов ASP.NET?
Решение
Вы можете получить информацию о сеансе WCF в памяти довольно простым способом. Чтобы устранить любые возможные внешние влияния в моих инструкциях, я предполагаю, что вы начинаете с совершенно нового проекта:
- Создайте новый проект библиотеки услуг WCF. Этот проект уже будет содержать услугу с
WSHttpBiding
связывание предварительно настроено. Перейдите к контракту на обслуживание (iService1.cs) и измените атрибут ServiceContract на следующее:
[ServiceContract(SessionMode = SessionMode.Required)]
Перейдите в Сервисную импульсную деятельность (Service1.cs) и добавьте следующий атрибут ServiceBehavior в класс службы (
Service1
):[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
Добавить данные сеанса в качестве членов сервисного класса (
Service1
):public class Service1 : IService1 { ... private string UserFullName { get; set; } ... }
Используйте участников для представления конкретных данных (не забудьте также добавить их в контракт на обслуживание,
IService1
):public class Service1 : IService1 { ... public string Welcome(string fullName) { UserFullName = fullName ?? "Guest"; return string.Format("Welcome back, {0}!", UserFullName); } public string Goodbye() { return string.Format("Come back soon, {0}!", UserFullName ?? "Guest"); } ... }
SessionMode.Required
гарантирует, что ваши клиенты отступили.
InstanceContextMode.PerSession
Обеспечивает создание экземпляра вашего сервисного класса (Service1) для каждого сеанса, чтобы вы могли сохранить в нем данные сеанса, и он будет существовать в памяти по нескольким вызовам в одном сеансе.
ConcurrencyMode.Single
гарантирует, что только один поток может ввести каждый экземпляр класса обслуживания (Service1), и предотвращает возможные проблемы параллелизма, если вы получаете доступ только к данным из класса службы (и в пределах безопасных потоков).
РЕДАКТИРОВАТЬ: По умолчанию, WSHttpBinding
только позволяет сессии безопасности. Но он также поддерживает надежные сеансы, которые позволяют создавать сеансы без обеспечения безопасности. Следующая конфигурация привязки отключает безопасность и обеспечивает надежные сеансы:
<wsHttpBinding>
<binding name="wsHttpBindingConfiguration">
<security mode="None" />
<reliableSession enabled="true" />
</binding>
</wsHttpBinding>
Другие советы
ИМО это то, что происходит, когда вы используете технологию с плохой абстракцией по сравнению с HTTP, как WCF. Тот факт, что веб-сервисы WCF могут быть теоретически размещены без HTTP (то есть над Net TCP, MSMQ и т. Д.), просто затрудняет использование встроенных функций HTTP, не входя в ад в ад в конфигурации и запустите игру «Угадайте правильную конфигурацию по пробным и ошибкам », где вы пробуете каждую возможную перестановку конфигурации, пока не найдете правильный, который работает!
В конечном счете, если вы не можете использовать WCF и должны были реализовать веб -службу с нуля, вы просто установили бы файл cookie, когда клиент успешно провел подлинность. Затем с каждым запросом клиента просто получите информацию о сеансе, на которую ссылается этот файл cookie.
Одно из возможных решений, если бы вам пришлось использовать WCF, - это взять управление сеансами в свои руки (Это то, что я делаю, когда я недоволен тем, что необходимо заставить что -то работать) и иметь явное свойство «сеанса» на всех ваших веб -сервисах, которые требуют сеанса/аутентификации (обычно руководство, генерируемого при аутентификации). Таким образом, для каждого последующего запроса вы используете GUID для регидратации информации о сеансе, связанной с этим клиентом.
Если вы заинтересованы в том, чтобы попробовать различные структуры веб -сервисов, я поддерживаю Структура веб -сервисов с открытым исходным кодом Это позволяет создавать, не содержащие конфигурации, сухие, тестируемые веб-сервисы, где (без какой-либо требуемой конфигурации) каждая веб-служба, которую вы создаете, автоматически доступна по сравнению с REST XML, JSON, JSV, SOAP 1.1, SOAP 1.2 Конечные точки. Эффективно это позволяет вам получить доступ к вашей же веб-сервису через HTTP GET URL-адрес для клиентов и простую отладку, а также конечные точки SOAP (популярный выбор, все еще предписываемый некоторыми предприятиями). А Привет, мир Учебное пособие должно дать вам хороший обзор некоторых его функций и того, как оно работает.