Перегрузка, которая принимает дополнительные заголовки, не была добавлена из-за симметрии: в типизированном сценарии вы могли указать заголовки для запроса, но не могли прочитать заголовки в ответе (так как тип возврата - это тип T, который не содержит коллекцию заголовков).
Вы можете, однако, использовать метод расширения, который делает это, используя обработчик сообщений, который может быть передан в конструктор MobileServiceClient
. Приведенный ниже код является примером такой реализации. Он реализует только два типизированных метода, но реализация тривиальна, если вы хотите добавить остальные.
class Program
{
public static MobileServiceClient MobileService = new MobileServiceClient(
"https://YOUR-SERVICE.azure-mobile.net/",
"YOUR-APPLICATION-KEY"
);
static void Main(string[] args)
{
DoWork().Wait();
}
static async Task DoWork()
{
var httpHeaders = new Dictionary<string, string>
{
{ "x-header-1", "value 1" },
{ "x-header-2", "value 2" },
};
var test = await MobileService.InvokeApiWithHeaders<Test>("headers", httpHeaders);
Console.WriteLine("Returned by the service:");
foreach (var k in test.AllHeaderValues.Keys)
{
Console.WriteLine(" {0}: {1}", k, test.AllHeaderValues[k]);
}
}
}
public class Test
{
public Dictionary<string, string> AllHeaderValues { get; set; }
}
public static class TypedInvokeApiWithHeadersExtensions
{
public static Task<T> InvokeApiWithHeaders<T>(this MobileServiceClient client, string apiName, IDictionary<string, string> httpHeaders)
{
var client2 = new MobileServiceClient(client.ApplicationUri, client.ApplicationKey, new AddHeadersHandler(httpHeaders));
return client2.InvokeApiAsync<T>(apiName);
}
public static Task<T> InvokeApiWithHeaders<T>(this MobileServiceClient client, string apiName, HttpMethod method, IDictionary<string, string> httpHeaders, IDictionary<string, string> queryParameters)
{
var client2 = new MobileServiceClient(client.ApplicationUri, client.ApplicationKey, new AddHeadersHandler(httpHeaders));
return client2.InvokeApiAsync<T>(apiName, method, queryParameters);
}
class AddHeadersHandler : DelegatingHandler
{
IDictionary<string, string> headers;
public AddHeadersHandler(IDictionary<string, string> headers)
{
this.headers = headers;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
foreach (var header in headers)
{
request.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
return base.SendAsync(request, cancellationToken);
}
}
}
Спасибо! Хорошая реализация! –