2013-07-23 14 views
26

Das macht mich verrückt. Ich benutze ASP.NET MVC. Ich habe einen Controller mit einer HttpPost-Aktion, die als Callback-URL fungiert, die von einem anderen Server (nicht unter meiner Kontrolle) aufgerufen wird. Ich möchte JSON dynamisch lesen, ohne die Verwendung von WebAPI oder Model Binding. An die URL wird auch ein Abfragezeichenfolgenparameter übergeben.ASP.NET MVC Read Raw JSON Postdaten

Die Callback-URL sieht wie folgt aus etwas:

http://domain.com/callback?secret=1234

Ich habe versucht, den gebuchten Eingang zu lesen mit:

[HttpPost] 
public ActionResult Callback(String secret) 
{ 
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd(); 

    // ... 
} 

jedoch "jsonData" ist immer null oder leer.

Ich möchte nur den Posteingang erhalten und in JsonFx stecken, damit ich dynamisch auf den Inhalt zugreifen kann. Irgendwelche Ideen, wie man das am einfachsten macht?

UPDATE

ich folgendes entdeckt habe ...

Während die oben nicht funktioniert (jsonData wird null oder leer sein), wird die folgende wenn ich konfigurieren, was wenig Optionen Ich habe auf dem aufrufenden Server, um den "geheimen" Abfragezeichenfolgenparameter wegzulassen, was alles ist, was ich an diesem Ende tun kann, da es nicht mein Server ist. In diesem Fall wird jsonData die richtigen JSON-String geschrieben:

[HttpPost] 
public ActionResult Callback(/* String secret */) 
{ 
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd(); 

    // ... 
} 

Das ist sehr frustrierend um zu arbeiten, und ich weiß nicht, eine einfache Möglichkeit, sowohl einen Abfrage-String zu akzeptieren und geschrieben JSON-Daten auf einem Standard-MVC Regler.

Ich habe einen "Callback-Controller" mit Aktionsmethoden, die verschiedene Daten (über GET, über Formular POST, über JSON POST, über JSON POST mit einem Query String usw.) von verschiedenen Drittanbieter-Servern akzeptieren. Dies sind Callbacks vom Händler-Typ, bei denen ich keine Kontrolle über die Formate oder Methoden habe, die zur Übermittlung von Informationen verwendet werden. Ich muss nur die Rückrufe akzeptieren und die Informationen verarbeiten, die da sein sollten.

Alles funktioniert gut in meinem Controller, außer der Fall von "JSON POST w/Abfrage String".

Dies scheint (zumindest für mich) ein Mangel in ASP.NET MVC-Standardcontrollern zu sein. ???

Kann jemand eine Lösung vorschlagen, die in einem Standard ASP.NET MVC-Controller verwendet werden kann?

+0

Wenn Sie es veröffentlichen, haben alle JSON gleich 'jsonData'. z.B. '[{jsonData: [{... alle json stuff ...}]}];' Ich habe das nicht getestet, aber es funktioniert möglicherweise – jzm

+0

Ich habe keine Kontrolle über den Server, der die Informationen veröffentlicht. Ich habe oben ein Update hinzugefügt. – lantram

+0

Warum wählen Sie den Namen "jsonData" aus? Die JSON-Daten könnten unter einem anderen Namen kommen. Versuchen Sie, FormCollection nach dem Namen zu durchsuchen. – tkt986

Antwort

50

Ihr erster Ansatz sollte funktionieren, wenn Sie berücksichtigen die Tatsache, dass ASP.NET MVC-Modell Bindung bereits den Stream gelesen hat, so dass Sie es zurückspulen sollen:

[HttpPost] 
public ActionResult Callback(string secret) 
{ 
    Request.InputStream.Seek(0, SeekOrigin.Begin); 
    string jsonData = new StreamReader(Request.InputStream).ReadToEnd(); 

    // ... 
} 
+0

Super! Vielen Dank. Ich wusste, dass es eine einfache Lösung geben musste. – lantram

+0

das funktioniert aber irgendwelche Ideen dazu http://stackoverflow.com/questions/21441571/get-post-request-parameters-in-custom-authorizeattribute – PUG

0

die position vor dem Lesen zu Zero zurückstellen der Strom. Request.InputStream.Position = 0