Вопрос

Мне нужно создать услугу 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 в памяти довольно простым способом. Чтобы устранить любые возможные внешние влияния в моих инструкциях, я предполагаю, что вы начинаете с совершенно нового проекта:

  1. Создайте новый проект библиотеки услуг WCF. Этот проект уже будет содержать услугу с WSHttpBiding связывание предварительно настроено.
  2. Перейдите к контракту на обслуживание (iService1.cs) и измените атрибут ServiceContract на следующее:

    [ServiceContract(SessionMode = SessionMode.Required)]
    
  3. Перейдите в Сервисную импульсную деятельность (Service1.cs) и добавьте следующий атрибут ServiceBehavior в класс службы (Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    
  4. Добавить данные сеанса в качестве членов сервисного класса (Service1):

    public class Service1 : IService1
    {
        ...
    
        private string UserFullName { get; set; }
    
        ...
    }
    
  5. Используйте участников для представления конкретных данных (не забудьте также добавить их в контракт на обслуживание, 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 (популярный выбор, все еще предписываемый некоторыми предприятиями). А Привет, мир Учебное пособие должно дать вам хороший обзор некоторых его функций и того, как оно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top