Вы могли использовать понимание списка или выражение генератора вместо этого:
', '.join([str(x) for x in list]) # list comprehension
', '.join(str(x) for x in list) # generator expression
Stateful
Наиболее оптимизированный метод - это написать настраиваемое хранилище сохраняемости, которое реализует IRelyingPartyApplicationStore
для «секретов», требуемых RP OpenID, и передать свой экземпляр в конструктор OpenIdRelyingParty (IRelyingPartyApplicationStore)
или зарегистрируйте его в своем файле web.config .
Stateless
Намного более простое решение, которое будет достаточно для большинства сценариев, - вместо этого используйте режим без сохранения состояния, чтобы не было необходимости совместно использовать состояние между серверами веб-фермы.
Вы можете активировать режим без сохранения состояния, создав экземпляр OpenIdRelyingParty
, передав null
в качестве экземпляра хранилища приложений . Вызов конструктора по умолчанию заставит DNOA использовать свое хранилище в памяти, которое не работает на фермах серверов,
Используя DotNetOpenID, вы должны иметь возможность сохранять нужное состояние во время аутентификации для клиента через cookie.
Изменить: У меня нет примера кода для этого потому что мне никогда не приходилось использовать DotNetOpenID в среде без сеанса, но я хотел бы проверить эту ссылку, она может предоставить вам необходимую информацию: http://code.google.com/p/dotnetopenid/wiki / WebFarmHowto
Here's how we're enabling stateless mode:
var uri = new Uri(Request.Url, Request.RawUrl);
var openid = new OpenIdRelyingParty(null, uri,
Request.HttpMethod == "GET" ? Request.QueryString : Request.Form);
Seems to work so far, though per Andrew there's a small performance hit. Not sure that matters since login is a fairly rare activity.