2013-07-23 22 views
26

To doprowadza mnie do szału. Używam ASP.NET MVC. Mam kontroler z działaniem HttpPost, który działa jak adres URL wywołania zwrotnego, który jest wywoływany przez inny serwer (nie pod moją kontrolą). Chcę dynamicznie odczytać publikację JSON bez korzystania z interfejsu WebAPI lub wiązania modelu. Adres URL ma również przekazany do niego parametr łańcucha zapytania.ASP.NET MVC Czytaj surowe JSON Post Data

Wywołanie zwrotne URL wygląda mniej więcej tak:

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

próbowałam czytać oddelegowanego wejście przy użyciu:

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

    // ... 
} 

Jednak "jsonData" jest zawsze wartość null lub pusty.

Po prostu chcę uzyskać zaksięgowane dane wejściowe i włożyć je do JsonFx, aby móc dynamicznie uzyskać dostęp do zawartości. Wszelkie pomysły, jak to zrobić w najprostszy możliwy sposób?

UPDATE

odkryłem następujące ...

Chociaż powyższy nie działa (jsonData będzie null lub pusty), następujące CZY gdybym skonfigurować co mam małe możliwości na serwerze wywołującym, aby pominąć "tajny" parametr ciągu zapytania, który dotyczy wszystkiego, co mogę zrobić na tym końcu, ponieważ nie jest to mój serwer. W tym przypadku, jsonData będą miały prawidłowy ciąg JSON pisał:

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

    // ... 
} 

Jest to bardzo frustrujące, aby obejść i nie wiem, w łatwy sposób do zaakceptowania zarówno ciąg kwerendy i wysłane dane JSON na standardowym MVC kontroler.

Mam "kontroler zwrotny" z metodami akcji, które akceptują różne dane (przez GET, poprzez formularz POST, przez JSON POST, przez JSON POST w/ciąg zapytania itp.) Z różnych serwerów stron trzecich. Są to callbacki typu kupieckiego, w których nie mam kontroli nad formatami lub metodami wykorzystywanymi do przekazywania informacji. Po prostu muszę zaakceptować wywołania zwrotne i przetworzyć informacje, które powinny tam być.

Wszystko działa dobrze w moim kontrolerem, z wyjątkiem przypadku "JSON POST w/a Query String".

Pojawia się (przynajmniej dla mnie) jako niedociągnięcie w standardowych kontrolerach ASP.NET MVC. ???

Czy ktoś może zaproponować rozwiązanie tego, które może być używane w standardowym kontrolerze ASP.NET MVC?

+0

po opublikowaniu, wszystkie json powinny być równe 'jsonData'. na przykład '[{jsonData: [{... wszystkie rzeczy JSON'a ...}]}];' Nie testowałem tego, ale może działać – jzm

+0

Nie mam kontroli nad serwerem, który publikuje informacje. Dodałem aktualizację powyżej. – lantram

+0

dlaczego wybierasz nazwę "jsonData" ?, dane json mogą nadejść na inną nazwę, spróbuj sprawdzić FormCollection dla nazwy. – tkt986

Odpowiedz

50

Początkowe podejście powinno działać, jeśli wziąć pod uwagę fakt, że Model ASP.NET MVC wiążących już przeczytał strumienia, więc należy ją przewinąć:

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

    // ... 
} 
+0

Awesome! Dziękuję Ci bardzo. Wiedziałem, że musi istnieć proste rozwiązanie. – lantram

+0

to działa, ale wszelkie pomysły na temat tego http://stackoverflow.com/questions/21441571/get-post-request-parameters-in-custom-authorize attribute – PUG

0

Reset position do Zero przed czytaniem strumień. Request.InputStream.Position = 0