2017-09-29 2 views
0

Ich weiß, wie man mit einer Zeichenfolge in Webapi abrufen. Aber ich weiß nicht, wie ich Hashtable mit meinem Webapi verwenden kann. Weil ich in hashtable unterschiedliche Bedingungen für jede Form habe, aber die gleiche api anrufe.Wie Abrufen von Daten mit Hashtable als Bedingung in WebAPI?

Ich bin mit NET3.5

Beispiel:

System.Collections.Hashtable _condition = new System.Collections.Hashtable(); 
      if (TPX.StringHelper.NVL(cbxStatus.EditValue, "-Please Select-") != "-Please Select-") 
       _condition.Add("Status", cbxStatus.EditValue.ToString()); 
      if (TPX.StringHelper.NVL(cbxCenter.EditValue, "-Please Select-") != "-Please Select-")    
       _condition.Add("Center", cbxCenter.EditValue.ToString()); 
      if (chkHideDone.Checked) 
       _condition.Add("IsDone", Convert.ToInt32(!chkHideDone.Checked)); 

     _condition.Add("StartDate", dtpBegin.DateTime.ToString("yyyyMMdd")); 
     _condition.Add("EndDate", dtpEnd.DateTime.ToString("yyyyMMdd")); 

     string itemJson = Newtonsoft.Json.JsonConvert.SerializeObject(_condition); 

     string navURL = GlobalParameters.Host + "api/Order/RetrieveOrderList?conditions="+itemJson; 

     using (System.Net.WebClient webClient = new System.Net.WebClient()) 
     { 
      webClient.Headers["Content-Type"] = "application/json"; 
      webClient.Encoding = Encoding.UTF8;     

      string sJson = webClient.DownloadString(navURL); List<Models.OrderList> myDeserializedObjList = (List<Models.OrderList>)Newtonsoft.Json.JsonConvert.DeserializeObject(sJson, typeof(List<Models.OrderList>)); 
      grdOrder.DataSource = myDeserializedObjList; 
     } 

Es Fehler geben, während String Download (webclient.downloadstring (navURL)). Hinweis: Ich habe die gleiche Logik kopiert, um eine weitere zu erstellen und gefiltert durch ein Feld anstelle von Hashtable ich habe keine Probleme. Ich brauche wirklich hoshhtbale, weil ich die gleiche Logik an verschiedenen Stellen in meinem Projekt verwenden, nur die Lieferbedingung ist anders.

Ich schätze wirklich für jede wertvolle Eingabe. Vielen Dank.

Antwort

0

Wenn Sie Hashtbale in JSON serialisieren, enthält die resultierende Zeichenfolge Anführungszeichen (und möglicherweise andere Sonderzeichen), die keine gültigen Zeichen in URL querystring sind. Diese Zeichen müssen mit percent encoding codiert werden. Um dies zu tun, können Sie die statische Methode Uri.EscapeDataString verwenden.

string navURL = GlobalParameters.Host + "api/Order/RetrieveOrderList?conditions=" + Uri.EscapeDataString(itemJson); 


EDIT:
Sie könnten einige Beispiele, wie passieren Wörterbuch zu WebAPI in

aber das funktioniert für mich finden:

// Declare binder that will convert parameters to Hashtable 
public class HashtableBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var json = bindingContext?.ValueProvider?.GetValue(bindingContext.ModelName)?.AttemptedValue as string; 
     if (json != null) 
     { 
      //Deserialize using Microsoft's JSON serializer 
      var serializer = new JavaScriptSerializer(); 
      bindingContext.Model = serializer.Deserialize<Hashtable>(json); 
      //or deserialize using Newtonsoft JSON convertor 
      //bindingContext.Model = JsonConvert.DeserializeObject<Hashtable>(json); 
      return true; 
     } 
     return false; 
    } 
} 


// In your controller, decorate parameter 
// with FromUri attribute and specify HashtableBinder 
// as BinderType 
[HttpGet] 
[Route("api/Order/RetrieveOrderList")] 
public void RetrieveOrderList([FromUri(BinderType = typeof(HashtableBinder), Name = "conditions")]Hashtable conditions) 
{ 
    // access hashtable in conditions parameter, e.g. var status = conditions["Status"] 
} 
+0

Ich habe versucht, wie Sie vorschlagen. Aber immer noch denselben Fehler zurückgegeben (Fehler 500, Interner Serverfehler). Bevor ich die Änderungen anwende, ist mein API-Link wie folgt: http: // localhost: 8989/api/Order/RetrieveOrderList? Bedingungen = {"StartDate": "20170923", "Status": "100", "EndDate": "20170930" } und jetzt http: // localhost: 8989/api/Auftrag/Abrufauftragsliste? Bedingungen =% 7B% 22StartDatum% 22% 3A% 2220170923% 22% 2C% 22Status% 22% 3A% 22100% 22% 2C% 22EndDate% 22% 3A% 2220170930% 22% 7D – Mdyahiya

+0

Obwohl 100% sicher ohne weitere Details nicht sein können, tritt Fehler 500 in der Regel auf, wenn die Methode zur Verarbeitung der WebAPI-Anforderung auf dem Server eine nicht behandelte Ausnahme auslöst. Das Problem liegt nun nicht beim WebClient, sondern auf dem Server. Sie sollten den Servercode debuggen und sehen, warum eine Ausnahme ausgelöst wird. –

+0

@Nuf, ich verwende die gleiche Logik und mein Datenmodell funktioniert ohne Ausnahme in einem anderen Projekt. Wenn ich anrufe, wirft Webapi seinen Fehler auf. So fühle ich etwas falsch mit meiner api Berufung Methode. Ich verwende HTTPGET. Ich bin mir nicht sicher, ob HTTP Post zum Abrufen von Daten verwendet werden kann. Das habe ich auch versucht. Wenn ein Beispiel für das Abrufen mit einer Hashtable-Bedingung in Webapi großartig ist. Vielen Dank – Mdyahiya

Verwandte Themen