ОК, я знаю, что ваш последний пост было несколько месяцев назад, но в случае, если вы все еще работаем над этим (или для людей вроде меня, кто бы любил чтобы увидеть ответ на этот вопрос), вот некоторая информация о , с которой вы столкнулись при создании запроса OAuth:
Нулевая ссылка взята из IServiceLocator
, которая используется для разрешения зависимостей. Если вы явно не передаете один в конструктор, он использует статическое свойство ServiceLocator.Current
в пространстве имен Microsoft.Practices.ServiceLocation
.
Это одна из многих подводных камней использования статических методов и глобального состояния, вы скрываете подобные проблемы у потребителя вашего API. Поэтому, если вы не указали локатор службы по умолчанию, возвращается null
, в результате чего получается NullReferenceException
.
Чтобы исправить эту проблему, я подключил реализацию IServiceLocator
, в которой используется StructureMap (один из множества доступных контейнеров IoC) в качестве контейнера. Наконец, вам нужно будет зарегистрировать экземпляры для двух интерфейсов: ISigningProvider
и INonceProvider
. К счастью, в сборке OAuth.Net.Components имеется несколько стандартных реализаций, таких как GuidNonceProvider и HmacSha1SigningProvider.
Результирующий код выглядит как что-то вроде этого:
var container = new Container();
container.Configure(a => a.For<INonceProvider>().Use<GuidNonceProvider>());
container.Configure(a => a.For<ISigningProvider>()
.Use<HmacSha1SigningProvider>()
.Named("signing.provider:HMAC-SHA1"));
var locator = new StructureMapAdapter(container);
ServiceLocator.SetLocatorProvider(delegate { return locator; });
Я понимаю, что это не окончательное решение к первоначальному вопросу (я все еще работаю над его работать самостоятельно), но я надеюсь, что это еще несколько шагов. И если вы уже давно отказались от этой реализации ... ну, счастливая кодировка!
К сожалению, забыли упомянуть об использовании OAuth 1.0a – Redth