2014-09-09 3 views
1

Я использую RestSharp, чтобы опубликовать объект для действия веб-API asp.net. Для формата JSON мои коды клиентской стороны работают нормально с серверной стороной , которая обеспечивает действие Post Web API. Для формата XML мои другие кодовые коды клиента не работают; отладка на стороне веб-интерфейса API, привязка объекта всегда равна нулю; входной параграф «analyticsLogs» получен как null для формата XML (см. коды ниже). Пожалуйста помоги.null объект получен на стороне сервера asp.net Действие веб-интерфейса с XML-форматом RestSharp

Следующая моя asp.net веб-действие POST API на стороне сервера:

[HttpPost] 
     public HttpResponseMessage PostAnalyticsLogs([FromBody] AnalyticsLogs analyticsLogs) 
     { 
      _logger.Info(analyticsLogs); 

      bool status = _analyticService.CreateAnalyticsLogs(analyticsLogs); 
      HttpResponseMessage response = new HttpResponseMessage(); 

      if(status) 
      { 
       response = Request.CreateResponse<AnalyticsLogs>(HttpStatusCode.OK, analyticsLogs); 
      }     
      else 
      { 
       response = Request.CreateResponse<AnalyticsLogs>(HttpStatusCode.InternalServerError, analyticsLogs); 
      } 
      return response; 
     } 

Клиентские коды для формата JSON хорошо работает:

private void buttonPostAnalyticsLogsDTO_Click(object sender, EventArgs e) 
     { 

      try 
      { 
       string pingMessage = string.Empty; 

       clearDataGridViewLinqToExcel(); 

       if (!isWebAPISiteRunning(out pingMessage)) 
       { 
        MessageBox.Show(pingMessage); 
        _logger.Error(pingMessage); 
        return; 
       } 

       // POST 
       AnalyticsLogs analyticsLogs = new AnalyticsLogs(); 
       Analytics analytics = new Analytics(); 
       analytics.Action = "Action test JSON"; 
       analytics.Category = "Category test JSON"; 
       analytics.Label = "Label test"; 
       analytics.Value = 2147483647; 
       analytics.Timestamp = DateTime.Now; 

       analyticsLogs.Add(analytics); 
       // REST SHARP 

       var client = new RestClient(_webApiBaseUrl); 
       var request = new RestRequest(); 
       request.Method = Method.POST; 
       request.RequestFormat = DataFormat.Json; // JSON *************** 
       request.Resource = "Analytic"; 


       request.AddBody(analyticsLogs); 


       var response = client.Execute<AnalyticsLogs>(request); 


       if (response.ResponseStatus == ResponseStatus.Error) 
       { 
        _logger.Error(response.ErrorMessage); 
        MessageBox.Show(response.ErrorMessage); 
        return; 
       } 

       dataGridViewLocalDMSWebAPIForDataAggregator.DataSource = response.Data; 
      } 
      catch(Exception ex) 
      { 
       _logger.Error(ex); 
       MessageBox.Show(ex.Message); 
      } 
     } 

Клиентские коды для XMLformat не работают:

private void buttonPostAnalyticsLogsDTO_XML_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       string pingMessage = string.Empty; 

       clearDataGridViewLinqToExcel(); 

       if (!isWebAPISiteRunning(out pingMessage)) 
       { 
        MessageBox.Show(pingMessage); 
        _logger.Error(pingMessage); 
        return; 
       } 

       // POST 
       AnalyticsLogs analyticsLogs = new AnalyticsLogs(); 
       Analytics analytics = new Analytics(); 
       analytics.Action = "Action test XML"; 
       analytics.Category = "Category test XML"; 
       analytics.Label = "Label test"; 
       analytics.Value = 47950494; 
       analytics.Timestamp = DateTime.Now; 

       analyticsLogs.Add(analytics); 

       // REST SHARP 

       var client = new RestClient(_webApiBaseUrl); 
       var request = new RestRequest(); 
       request.Method = Method.POST; 
       request.RequestFormat = DataFormat.Xml; // XML ***************** 
       request.Resource = "Analytic"; 


       request.AddBody(analyticsLogs); 


       var response = client.Execute<AnalyticsLogs>(request); 


       if (response.ResponseStatus == ResponseStatus.Error) 
       { 
        _logger.Error(response.ErrorMessage); 
        MessageBox.Show(response.ErrorMessage); 
        return; 
       } 

       dataGridViewLocalDMSWebAPIForDataAggregator.DataSource = response.Data; 
      } 
      catch (Exception ex) 
      { 
       _logger.Error(ex); 
       MessageBox.Show(ex.Message); 
      } 
     } 

Мои пользовательские DTO классы:

public class Analytics 
    { 
     public DateTime Timestamp { get; set; } 

     public long UserExpId { get; set; } 
     public string UserExpStatus { get; set; } 
     public string Category { get; set; } 
     public string Action { get; set; } 
     public string Label { get; set; } 
     public int Value { get; set; } 
    } 

public class AnalyticsLogs : List<Analytics> 
    { 
    } 

Отладка проблемы с кодами клиента XML дает мне некоторую информацию:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<RestSharp.Parameter>(request.Parameters)).Items[0] :RequestBody 


    +  [0] {text/xml=<AnalyticsLogs> 
    <Analytics> 
    <Timestamp>9/9/2014 9:15:58 AM</Timestamp> 
    <UserExpId>0</UserExpId> 
    <Category>Category test XML</Category> 
    <Action>Action test XML</Action> 
    <Label>Label test</Label> 
    <Value>47950494</Value> 
    </Analytics> 
</AnalyticsLogs>}  RestSharp.Parameter 



    request.RootElement : null 
+0

, вероятно, попробуйте без поля 'datetime'. Если это сработает, то это связано с« проблемой сериализации даты »с' restsharp' –

ответ

2

Я нашел проблему. Серийный сервер RestSharp не совместим с DataContractSerializer или XmlSerializer. Оба используются из Web API (по умолчанию: DataContractSerializer).

RestSharp производит чистый XML, но DataContractSerializer нуждается в дополнительной информации (например, атрибутах xmlns: i и xmlns).

Вы можете воспроизвести вашу проблему внутри консольного приложения с этим кодом: (Это будет сгенерировано подробное исключение в процессе десериализации)

AnalyticsLogs analyticsLogs = new AnalyticsLogs(); 
Analytics analytics = new Analytics(); 
analytics.Action = "Action test XML"; 
analytics.Category = "Category test XML"; 
analytics.Label = "Label test"; 
analytics.Value = 47950494; 
analytics.Timestamp = DateTime.Now; 

analyticsLogs.Add(analytics); 

var serializer = new RestSharp.Serializers.XmlSerializer(); 
var xml = serializer.Serialize(analyticsLogs); 
var obj = Deserialize<AnalyticsLogs>(xml); 

static string Serialize<T>(T value) { 
    XmlMediaTypeFormatter formatter = new XmlMediaTypeFormatter(); 
    // formatter.UseXmlSerializer = true; 

    // Create a dummy HTTP Content. 
    Stream stream = new MemoryStream(); 
    var content = new StreamContent(stream); 
    /// Serialize the object. 
    formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait(); 
    // Read the serialized string. 
    stream.Position = 0; 
    return content.ReadAsStringAsync().Result; 
} 

static T Deserialize<T>(string str) where T : class { 
    XmlMediaTypeFormatter formatter = new XmlMediaTypeFormatter(); 
    // formatter.UseXmlSerializer = true; 

    // Write the serialized string to a memory stream. 
    Stream stream = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write(str); 
    writer.Flush(); 
    stream.Position = 0; 
    // Deserialize to an object of type T 
    return formatter.ReadFromStreamAsync(typeof(T), stream, null, null).Result as T; 
} 

Методы из Web API Tutorial и вы должны установить Web API в ваше консольное приложение. Я не нашел решения, чтобы заставить их работать вместе - sry :(

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

  • Нет связанных вопросов^_^