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

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

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

Тем не менее, WCF-сессии кажутся недооцененными и ставят странный набор предварительных требований к службе, и я не смог найти конфигурацию, которая соответствует моим потребностям: должен быть размещен в IIS, должен использовать транспорт http или https и может не отвечайте на проверку подлинности Windows, потому что клиент и сервер не будут частью одного домена. Я пытаюсь добиться этого, используя wsHttpBinding, я слышал, что сеансам WCF требовалось либо сообщение безопасности, либо надежное сообщение, но: - При использовании стандартной привязки, и когда серверы не являются частью одного домена, происходит сбой с «SecurityNegotiationException не был аутентифицирован сервисом »исключение. Это довольно логично, так как он использовал безопасность Windows.

Если я отключаю функцию безопасности завершена, она завершается с «Сессией контракта, но Binding« WSHttpBinding »не поддерживает ее или не настроен для ее поддержки».

Если при отключенной защите я включаю надежное сообщение, я получаю исключение «Проверка привязки завершилась неудачно, поскольку WSHttpBinding не поддерживает надежные сеансы по транспортной безопасности (HTTPS). Не удалось открыть фабрику каналов или хост-службу. Используйте безопасность сообщений для безопасного и надежного обмена сообщениями по HTTP ».

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

Есть ли какая-либо конфигурация, которая может работать для меня? Или мне просто вернуться к плану использования сессий asp.net?

 Robert22 янв. 2011 г., 12:59
Обнаружено, что сеанс asp.net не работает из-за отключения файлов cookie, есть рабочая версия кода с использованием сеансов asp.net.

Ответы на вопрос(2)

что происходит, когда вы используете технологию с плохой абстракцией по HTTP, такую ​​как WCF. Тот факт, что веб-сервисы WCF теоретически могут быть размещены без HTTP (т. Е. Через NET TCP, MSMQ и т. Д.), Просто затрудняет использование встроенных функций HTTP без входа в ад настройки и запускает игру «угадайте правильную конфигурацию» методом проб и ошибок ", где вы пробуете все возможные конфигурации перестановки, пока не найдете правильный, который работает!

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

Одно из возможных решений, если вам пришлось использовать WCF, - взять управление сессиями в свои руки.(Это то, что я делаю, когда я недоволен усилиями, необходимыми, чтобы заставить что-то работать) и иметь явное свойство 'Session' во всех ваших веб-сервисах, которые требуют сеанса / аутентификации (обычно это руководство, генерируемое при аутентификации). Таким образом, для каждого последующего запроса вы используете guid для регидратации информации о сеансе, связанной с этим клиентом.

Если вы заинтересованы в испытании различных структур веб-сервисов, я поддерживаюOpen Source Web Services Framework это позволяет вам создавать неконфигурируемые, СУХИЕ, тестируемые веб-сервисы, где (без какой-либо конфигурации) каждый создаваемый веб-сервис автоматически доступен через конечные точки REST XML, JSON, JSV, SOAP 1.1, SOAP 1.2. По сути, он позволяет вам получить доступ к той же веб-службе через URL-адрес HTTP GET для клиентов REST-ful и простую отладку, а также конечные точки SOAP (популярный выбор, который по-прежнему требуется некоторыми предприятиями).Привет, мир Учебное пособие должно дать вам хороший обзор некоторых его функций и того, как он работает.

 Robert22 янв. 2011 г., 13:19
Спасибо за ответ! Хотя я в значительной степени согласен с вашим ответом, к сожалению, ограничением проекта является необходимость использования WCF. Я обязательно взгляну на ServiceStack для проектов с менее строгими ограничениями на используемые технологии.
Решение Вопроса

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

Создайте новый проект библиотеки сервисов 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>
 Robert22 янв. 2011 г., 17:24
Это более или менее то, что я сделал, похоже, для работы нужна проверка подлинности на уровне сообщений. Для меня это не вариант, так как клиент и сервер не будут находиться в одном домене.
 Allon Guralnek23 янв. 2011 г., 08:45
@ Роберт: Вы обновили сервисную ссылку в своем клиенте? Все мои инструкции предполагают совершенно новый проект. Если вы начнете с нуля, вы увидите, что это работает. Я не могу вам в этом помочь, поскольку я не вижу всего вашего решения - ваша конфигурация, атрибуты контракта на обслуживание, а также реализация и атрибуты сервиса и даже то, как сконфигурирована ваша среда, могут вызвать ошибки, выходящие за рамки этого. вопрос.
 Robert23 янв. 2011 г., 05:50
Используя предложенную вами конфигурацию на клиенте, я получаю следующую ошибку. ProtocolException: удаленная конечная точка отправила нераспознанную ошибку с пространством имен,w3.org/2003/05/soap-envelopeИмя отправителя и причина Сообщение не может быть обработано. Это, скорее всего, потому что действиеschemas.xmlsoap.org/ws/2005/02/rm/CreateSequence'неверно или потому, что сообщение содержит недопустимый или устаревший токен контекста безопасности или потому что есть ..
 Robert23 янв. 2011 г., 14:26
Я не понял ваших инструкций при редактировании, и я размещал новую конфигурацию на стороне клиента, а не на сервере. Я изменил это, и все, кажется, работает как ожидалось. Спасибо за вашу помощь!
 Allon Guralnek22 янв. 2011 г., 21:29
@ Роберт: правильно, но есть решение. Смотрите изменения в моем ответе. Я надеюсь, что это решит вашу проблему.

Ваш ответ на вопрос