Asp.net сессия в wcf через фабрику каналов в silverlight - PullRequest
1 голос
/ 31 декабря 2010

Моя проблема в том, что WCF не поддерживает сеанс среди вызовов Silverlight. Каждый звонок - это отдельная сессия asp.net. Я знаю, что это может работать, поскольку у меня есть пример, который использует автоматически созданный прокси для WCF в Silverlight, но я использую Channel Factory. Я искал по всей сети, но, к сожалению, большинство людей, кажется, используют генератор прокси.

Мой web.config

<bindings>
  <basicHttpBinding>
    <binding name="databaseServiceBasicHttp" allowCookies="true" />
  </basicHttpBinding>
</bindings>

<services>
  <service name="databaseService"
           behaviorConfiguration="Debug">
    <endpoint address=""
      binding="basicHttpBinding" bindingConfiguration="databaseServiceBasicHttp" contract="BlueGazelle.DatabaseServiceContracts.IDatabaseService" />
  </service>

</services>

Конфигурация Silverlight для переплета

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding >
        <binding name="databaseService" enableHttpCookieContainer="true"/>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:53392/Services/DatabaseService.svc"
                binding="basicHttpBinding" bindingConfiguration="databaseService" contract="BlueGazelle.DatabaseServiceContracts.IDatabaseService"
                name="BlueGazelle.DatabaseService.Code.DatabaseService"/>
    </client>
  </system.serviceModel>
</configuration>

Как создать канал

var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();

Что-то не так с ChannelFactory? Должен ли я включить что-то, чтобы на нем были файлы cookie?

Ответы [ 2 ]

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

Спасибо за ваш ответ, Фил, но я сделал то, что вы упомянули ранее. Это, конечно, необходимо, но в моем случае это не было проблемой.

Мне нужно было добавить контейнер cookie в мой сгенерированный прокси. Я нашел ответ на одной веб-странице, но не могу найти его сейчас.

В любом случае, вот код, если кому-то интересно.

 var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();
        var cookieManager = ((IChannel)service).GetProperty<IHttpCookieContainerManager>();
        if (cookieManager.CookieContainer == null)
        {
            cookieManager.CookieContainer = new CookieContainer();
        }
0 голосов
/ 31 декабря 2010

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

1, добавлен следующий атрибут в интерфейс вашего сервиса ...

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

2, внутри вашего web.config добавьте следующее ...

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

3, внутри вашего web.config добавьте следующее ...

<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" timeout="20"/>

Silverlight не имеет проблем при работе с сеансами ASP.NET, которые используют вышеуказанный метод cookie для передачи информации о сеансе. Работать с сеансами без файлов cookie было бы непросто, поскольку для этого необходимо было бы передавать информацию как часть URL.

Для получения дополнительной информации я нашел эту запись в блоге .

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