sdk/Common/Communication/ServiceClient.cs (88 lines of code) (raw):
/*
* Copyright (C) Alibaba Cloud Computing
* All rights reserved.
*
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Aliyun.OSS.Util;
using Aliyun.OSS.Common.Handlers;
using Aliyun.OSS.Properties;
namespace Aliyun.OSS.Common.Communication
{
/// <summary>
/// The default implementation of <see cref="IServiceClient" />.
/// </summary>
internal abstract class ServiceClient : IServiceClient
{
#region Fields and Properties
private readonly ClientConfiguration _configuration;
internal ClientConfiguration Configuration
{
get { return _configuration; }
}
#endregion
#region Constructors
protected ServiceClient(ClientConfiguration configuration)
{
_configuration = configuration;
}
public static ServiceClient Create(ClientConfiguration configuration)
{
#if NETCOREAPP2_0
//return new ServiceClientImpl(configuration);
if (configuration.UseNewServiceClient)
{
return new ServiceClientNewImpl(configuration);
}
else
{
return new ServiceClientImpl(configuration);
}
#else
return new ServiceClientImpl(configuration);
#endif
}
#endregion
#region IServiceClient Members
public ServiceResponse Send(ServiceRequest request, ExecutionContext context)
{
SignRequest(request, context);
var response = SendCore(request, context);
HandleResponse(response, context.ResponseHandlers);
return response;
}
public IAsyncResult BeginSend(ServiceRequest request, ExecutionContext context,
AsyncCallback callback, object state)
{
SignRequest(request, context);
return BeginSendCore(request, context, callback, state);
}
public ServiceResponse EndSend(IAsyncResult aysncResult)
{
var ar = aysncResult as AsyncResult<ServiceResponse>;
Debug.Assert(ar != null);
if (ar == null)
{
throw new ArgumentException("ar must be type of AsyncResult<ServiceResponse>");
}
try
{
// Must dispose the async result instance.
var result = ar.GetResult();
ar.Dispose();
return result;
}
catch (ObjectDisposedException)
{
throw new InvalidOperationException(Resources.ExceptionEndOperationHasBeenCalled);
}
}
#endregion
protected abstract ServiceResponse SendCore(ServiceRequest request, ExecutionContext context);
protected abstract IAsyncResult BeginSendCore(ServiceRequest request, ExecutionContext context,
AsyncCallback callback, Object state);
private static void SignRequest(ServiceRequest request, ExecutionContext context)
{
if (context.Signer != null)
context.Signer.Sign(request, context.Credentials);
}
protected static void HandleResponse(ServiceResponse response, IEnumerable<IResponseHandler> handlers)
{
foreach (var handler in handlers)
handler.Handle(response);
}
}
}