2016-01-05 4 views
1

При вызове службы Azure Mobile Service я хотел бы сделать запрос к пользовательской службе REST и передать мои собственные значения заголовка вместе и получить типизированный результат. Почему у меня нет такой возможности? Что мне не хватает?Типированный результат от мобильной службы Azure с пользовательскими заголовками

Глядя на https://msdn.microsoft.com/en-us/library/azure/microsoft.windowsazure.mobileservices.mobileserviceclient.invokeapiasync.aspx Я могу предоставить только пользовательские заголовки при создании нетипизированного запроса.

ответ

1

Перегрузка, которая принимает дополнительные заголовки, не была добавлена ​​из-за симметрии: в типизированном сценарии вы могли указать заголовки для запроса, но не могли прочитать заголовки в ответе (так как тип возврата - это тип 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); 
     } 
    } 
} 
+0

Спасибо! Хорошая реализация! –

Смежные вопросы