2015-03-18 3 views
0

Я хочу записать (сохранить в db или файл и т. Д.) Все запросы и ответы с исключениями WebClient. Я использую производный класс: public class GzipWebClient: WebClient {...}Запросы на регистрацию, ответы и исключения WebClient

Где я должен улавливать загрузку запросов данными, загружая ответы и исключения? Или я должен переопределить некоторые методы?

Могу ли я использовать «защищенный переопределить WebRequest GetWebRequest (Uri address)» для сбора данных?

Некоторые с помощью:

private T GetDeserializedResponse<T>(string url) 
    { 
     using (var wc = new GzipWebClient()) 
     { 
      wc.Encoding = Encoding.UTF8; 
      string fullUrl = BaseUrl + url; 
      string response = wc.DownloadString(fullUrl); 

      try 
      { 
       return JsonConvert.DeserializeObject<T>(response); 
      } 
      catch 
      { 
       _logger.Error(response); 
       throw; 
      } 
     } 
    } 

или

 string url = shop.Warehouse != null ? 
      string.Format("/api/v1/cabinet/{0}/shop_create.json", MasterApiKey) : 
      string.Format("/api/v1/{0}/shop_create.json", MasterApiKey); 

     string name = shop.Name; 
     string namePostfix = DateTime.Now.ToString("yyMMddhhmmss"); 
     if ((name + namePostfix).Length > 64) 
      name = name.Substring(0, 64 - namePostfix.Length); 

     string data = shop.Warehouse != null ? 
      string.Format("name={0}&warehouse={1}&address={2}", name + namePostfix, shop.Warehouse.Id, shop.Address) : 
      string.Format("name={0}&address={1}", name + namePostfix, shop.Address); 

     using (var wc = new GzipWebClient()) 
     { 
      wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
      wc.Encoding = Encoding.UTF8; 

      string fullUrl = BaseUrl + url; 

      string response = wc.UploadString(fullUrl, data); 

      var shopData = JsonConvert.DeserializeObject<DDeliveryCreateShopResponse>(response); 

      if (!shopData.Success) 
      { 
       throw new DeliveryCreateStoreException(shop.Name); 
      } 

      if (string.IsNullOrEmpty(shopData.IdKeyPair.Key)) 
      { 
       throw new DeliveryCreateStoreException(shop.Name); 
      } 

      shop.Id = shopData.IdKeyPair.Id; 
      shop.Key = shopData.IdKeyPair.Key; 
      return shop; 
     } 
+0

введите код, звонок, что-то еще, кроме методов; что делает GzipWebClient? Можем ли мы увидеть, как/при загрузке веб-страницы? – clement

ответ

4

Для вызова веб-сервиса, и если вы используете .Net 4.5, это проще, если вы используете HttpClient.

Вы можете создать LoggingHandler так:

public class LoggingHandler : DelegatingHandler 
{ 
    public LoggingHandler() 
     : this(new HttpClientHandler()) 
    { } 

    public LoggingHandler(HttpMessageHandler innerHandler) 
     : base(innerHandler) 
    { } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var activityId = Guid.NewGuid(); 
     using (new Tracer("Service Call", activityId)) 
     { 
      var entry = new LogEntry { Severity = TraceEventType.Verbose, Title = "Request" }; 
      if (Logger.ShouldLog(entry)) 
      { 
       entry.Message = request.ToString(); 
       if (request.Content != null) 
       { 
        entry.Message += Environment.NewLine; 
        entry.Message += await request.Content 
         .ReadAsStringAsync() 
         .ConfigureAwait(false); 
       } 
       Logger.Write(entry); 
      } 

      var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); 

      entry = new LogEntry { Severity = TraceEventType.Verbose, Title = "Response" }; 
      if (Logger.ShouldLog(entry)) 
      { 
       entry.Message = response.ToString(); 
       if (response.Content != null) 
        entry.Message += await response.Content 
         .ReadAsStringAsync() 
         .ConfigureAwait(false); 

       Logger.Write(entry); 
      } 

      return response; 
     } 
    } 
} 

А затем создать HttpClient:

//hook all http request and response 
var hc = new HttpClient(new LoggingHandler()); 

Документация для HttpClient класса: https://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.118%29.aspx

Сравнение HttpClient и WebClientNeed help deciding between HttpClient and WebClient

0

Вы должны войти в Exceptiosn в самой нижней точке вашего приложения, в вашем DAL, если у вас есть для того, чтобы иметь дело исключения из ваших DB.

+0

Нет, в моем случае мне приходится регистрировать (или делать что-то еще после анализа журналов) любые ответы (200, 404, 500 и т. Д.) В логике, которая работает с указанной внешней службой. – FireShock

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