2016-06-23 5 views
2

Was ich tun möchte, ist sehr einfach in PHP. Ich möchte nur den Inhalt des Posts lesen. Es ist auch sehr einfach auf sailsjs/node ... Ich gebe nur das Ergebnis aus der async-Funktion zurück.Wie liest man den Inhalt eines JSON-Posts mit asp vor der Verarbeitung der Anfrage?

In C# asp die Antwort entzieht sich mir. Ich möchte, dass die Funktion den Inhalt des Posts liest, bevor sie versucht, den Post zu verarbeiten.

Manchmal funktioniert der folgende Code. Manchmal passiert das Lesen des JSON aus dem Post zu langsam und jsonText wird als "" gelesen, so dass nichts verarbeitet wird.

In allen Testläufen wird der JSON im Hauptteil der Post gesendet.

Wie kann man am besten eine httpResponse zurückgeben, nachdem sichergestellt wurde, dass der Inhalt des Posts zuerst gelesen wird?

public HttpResponseMessage Post() 
    { 
     string content; 
     try 
     { 
      string result = String.Empty; 
      Newtonsoft.Json.Linq.JObject jObject = null; 

      string jsonText = String.Empty; 
      var syncTask = new Task<string>(() => { 
        return Request.Content.ReadAsStringAsync().Result; 
      }); 
      /* I'm expecting that this will finish */ 
      syncTask.RunSynchronously(); 
      jsonText = syncTask.Result; 

      /* before this line of code executes */ 
      System.Net.Http.HttpResponseMessage response = new HttpResponseMessage(); 

      if (jsonText == "") 
      { 
       result = "{\"error\":\"body is empty\"}"; 
       response.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
      } 
      else 
      { 
       jObject = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.Linq.JRaw.Parse(jsonText); 

       string ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
       jObject["ipAddress"] = ipAddress; 

       Models.JsonXML jsonXml = new JsonXML(jObject.ToString(Newtonsoft.Json.Formatting.None)); 
       System.Xml.XmlDocument document = new System.Xml.XmlDocument(); 
       document.LoadXml(jsonXml.xml); 
       result = ReferralsManager.ProcessReferral(document); 
       if (result == "") 
       { 
        result = "{}"; 
       } 

       response.StatusCode = System.Net.HttpStatusCode.OK; 
      } 
      response.Content = new StringContent(result); 
      response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 

      return response; 
     } 
     catch (Exception ex) 
     { 
      content = ErrorMessage.ServerException(Converter, ex); 
      return Request.ToResponseMessage(content); 
     } 
     finally 
     { 
      LogManager.GetCurrentClassLogger().Info(InfoMessage.FUNC_ENDS, "Process Referral"); 
     } 
    } 

Der Arbeits modifizierte Code nach der Antwort von @Mekap ist

public class ProcessReferralAddressModel { 

     public ProcessReferralAddressModel() { } 

     public string address { get; set; } 
     public string name { get; set; } 

    } 

    public class ProcessReferralModel 
    { 
     public ProcessReferralModel() 
     { 

     } 
     public string uuid { get; set; } 
     public DateTime date { get; set; } 
     public ProcessReferralAddressModel from { get; set; } 
     public ProcessReferralAddressModel[] to { get; set; } 
     public string subject { get; set; } 
     public string text { get; set; } 
     public string html { get; set; } 

    } 

    /// <summary> 
    /// Process a referral. 
    /// </summary> 
    /// <param name="userid">The userid.</param> 
    /// <returns></returns> 
    public HttpResponseMessage Post([FromBody] ProcessReferralModel processReferralModel) 
    { 
     string content; 
     string jsonText = Newtonsoft.Json.JsonConvert.SerializeObject(processReferralModel) ; 

     try 
     { 
      string result = String.Empty; 
      Newtonsoft.Json.Linq.JObject jObject = null; 


      System.Net.Http.HttpResponseMessage response = new HttpResponseMessage(); 

      if (jsonText == "" || jsonText == null) 
      { 
       result = "{\"error\":\"body is empty\"}"; 
       response.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
      } 
      else 
      { 
       jObject = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.Linq.JRaw.Parse(jsonText); 

       string ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
       jObject["ipAddress"] = ipAddress; 

       Models.JsonXML jsonXml = new JsonXML(jObject.ToString(Newtonsoft.Json.Formatting.None)); 
       System.Xml.XmlDocument document = new System.Xml.XmlDocument(); 
       document.LoadXml(jsonXml.xml); 
       result = ReferralsManager.ProcessReferral(document); 
       if (result == "") 
       { 
        result = "{}"; 
       } 

       response.StatusCode = System.Net.HttpStatusCode.OK; 
      } 
      response.Content = new StringContent(result); 
      response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 

      return response; 
     } 
     catch (Exception ex) 
     { 
      content = ErrorMessage.ServerException(Converter, ex); 
      return Request.ToResponseMessage(content); 
     } 
     finally 
     { 
      LogManager.GetCurrentClassLogger().Info(InfoMessage.FUNC_ENDS, "Process Referral"); 
     } 
    } 
+1

Sind die Inhalte, die Sie suchen, immer im Text Ihrer Anfrage zu finden? Wenn ja, kann Asp.Web APi es an Ihrer Stelle tun und sicherstellen, dass Sie nur die Daten erhalten, die Sie angefordert haben. – Mekap

+0

Versuchen Sie, Ihre Methode als 'async' zu markieren und dann' erwarten' –

+0

zu verwenden, müssen Sie sicherstellen, dass Sie anrufen alle 'async' Methoden mit' .GetAwaiter(). GetResult() 'am Ende, um sicherzustellen, dass Ihr Code auf die Fertigstellung wartet –

Antwort

1

Die json Sie holen, für unser Beispiel so etwas wie

{ "ID" : 3, 
"StringCmd" : "ls -l" 
} 

Für den Anfang schauen, wir Wir werden eine kleine Klasse schreiben, die unsere Daten in Ihrer Web-API darstellt

public class StringCmdModel 
{ 
    public StringCmdModel() 
    { 
    } 
    public int ID { get; set; } 
    public string StringCmd { get; set; } 
} 

Nun müssen wir nur unseren Einstiegspunkt in unserem WebAPI schreiben:

[HttpPost] 
public HttpResponseMessage PostFonction([FromBody] StringCmdModel NewEntry) 

Sie nicht für die Existenz der Daten innerhalb der Funktion zu überprüfen. Sie sollten jedoch immer noch ihre Werte überprüfen, falls Sie schlecht formatierte JSON- oder böswillige Anrufe erhalten.

Aber, wenn Sie einen Anruf mit Json erhalten, die nicht die entspricht, die Sie in Parameter vom Körper gaben, wird diese Funktion nicht ausgeführt, und der Server wird einen 500 Fehler selbst werfen.

Verwandte Themen