Как tweakt сказал, Amazon S3 является хорошей моделью для работы с. Их подписи запроса действительно имеют некоторые функции (такие как слияние метки времени), что справка принимает меры и против случайного и злонамеренного воспроизведения запроса.
хорошая вещь об Основном HTTP состоит в том, что фактически все библиотеки HTTP поддерживают его. Необходимо будет, конечно, потребовать SSL в этом случае, потому что отправка незашифрованных паролей по сети является почти универсально плохой вещью. Основной предпочтительно для Обзора при использовании SSL, потому что, даже если вызывающая сторона уже знает, что учетные данные требуются, Обзор требует, чтобы дополнительное распространение в прямом и обратном направлениях обменивалось значением данного случая. С Основным вызывающие стороны просто отправляют учетным данным первый раз.
, Как только идентификационные данные клиента устанавливаются, авторизация является действительно просто проблемой реализации. Однако Вы могли делегировать авторизацию к некоторому другому компоненту с существующей моделью авторизации. Снова хорошей вещью об Основном здесь является Ваш сервер, заканчивается с копией простого текста пароля клиента, который можно просто передать другому компоненту в инфраструктуре по мере необходимости.
Мне повезло с этой моделью:
Dim service As New MyService()
Dim closed As Boolean = False
Try
service.Open()
If Not service.State = ServiceModel.CommunicationState.Opened Then
''Handle a not-opened state here
End If
service.MyMethod()
service.Close()
closed = true
Catch ex As Exception
''Handle errors here
Finally
If Not closed Then
service.Abort()
End If
End Try
service = Nothing
См. Недоступно: Попытка WCF # 1 * , где он предлагает удобный метод оболочки:
public delegate void UseServiceDelegate<T>(T proxy);
public static class Service<T>
{
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
public static void Use(UseServiceDelegate<T> codeBlock)
{
var proxy = (IClientChannel)_channelFactory.CreateChannel();
var success = false;
try
{
codeBlock((T)proxy);
proxy.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
}
}
Использование:
Service<IOrderService>.Use(
orderService =>
{
orderService.PlaceOrder(request);
});
* Ссылка удалена, поскольку кажется вредоносной.
Вы правильно поняли. Я использовал следующий метод расширения, чтобы свести к минимуму повторяющиеся строки кода.
Если вы используете кэш на стороне клиента, вы можете рассмотреть возможность использования деревьев выражений (см. http://thegrenade.blogspot.com/2009/07/using-expression-trees-for -more-elegance.html ):
private static TEntity GetItem<TProxy, TEntity, TIdentity>(Expression<Func<TProxy, TIdentity, TEntity>> expression, TProxy proxy, TIdentity id)
where TEntity : class
where TProxy : ICommunicationObject
{
TEntity item = Cache.GetItem<TEntity, TIdentity>(id);
if (item == null)
{
try
{
var originalDelegate = expression.Compile();
item = originalDelegate.Invoke(proxy, id);
}
finally
{
try{ proxy.Close(); }
finally { proxy.Abort(); }
}
Cache.AddItem<TEntity, TIdentity>(item);
}
return item;
}
Использование:
Product p = GetItem((client, identifier) => client.GetProduct(identifier), new CatalogServiceClient(), 123);