2013-07-23 40 views
26

Điều này khiến tôi phát điên. Tôi đang sử dụng ASP.NET MVC. Tôi có một bộ điều khiển với một hành động HttpPost hoạt động như một URL gọi lại được gọi bởi một máy chủ khác (không thuộc quyền kiểm soát của tôi). Tôi muốn tự động đọc JSON được đăng lên nó mà không cần sử dụng WebAPI hoặc Mô hình ràng buộc. URL cũng có tham số chuỗi truy vấn được truyền cho nó.ASP.NET MVC Đọc dữ liệu JSON thô nguyên

URL gọi lại trông giống như sau:

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

Tôi đã thử đọc đầu vào được thông báo bằng:

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

    // ... 
} 

Tuy nhiên "jsonData" luôn luôn là null hoặc rỗng.

Tôi chỉ muốn nhận dữ liệu đã đăng và nhập vào JsonFx để tôi có thể truy cập động nội dung. Bất kỳ ý tưởng về cách làm điều này một cách dễ dàng nhất có thể?

CẬP NHẬT

Tôi đã khám phá ra sau ...

Trong khi ở trên không làm việc (jsonData sẽ được null hoặc trống), sau đây KHÔNG nếu tôi cấu hình những tùy chọn ít Tôi có trên máy chủ gọi để bỏ qua tham số chuỗi truy vấn "bí mật", đó là tất cả những gì tôi có thể thực hiện ở phần cuối vì đó không phải là máy chủ của tôi. Trong trường hợp này, jsonData sẽ có đúng posted JSON chuỗi:

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

    // ... 
} 

này là rất bực bội để làm việc xung quanh và tôi không biết một cách dễ dàng để chấp nhận cả một chuỗi truy vấn và gửi dữ liệu JSON trên MVC chuẩn điều khiển.

Tôi có "bộ điều khiển gọi lại" với các phương thức Hành động chấp nhận nhiều dữ liệu khác nhau (thông qua GET, qua biểu mẫu POST, qua JSON POST, qua JSON POST w/Chuỗi truy vấn, v.v.) từ các máy chủ của bên thứ ba khác nhau. Đây là những callback kiểu người bán mà tôi không kiểm soát được các định dạng hoặc phương thức được sử dụng để truyền tải thông tin. Tôi chỉ cần chấp nhận các cuộc gọi lại và xử lý thông tin cần có.

Tất cả đều hoạt động tốt trong Bộ điều khiển của tôi, ngoại trừ trường hợp "JSON POST w/Chuỗi truy vấn".

Điều này xuất hiện (ít nhất là với tôi) là thiếu sót trong bộ điều khiển ASP.NET MVC tiêu chuẩn. ???

Có ai có thể đề xuất giải pháp cho điều này có thể được sử dụng trong bộ điều khiển ASP.NET MVC tiêu chuẩn không?

+0

khi bạn đăng, có tất cả json bằng 'jsonData'. ví dụ. '[{jsonData: [{... all json stuff ...}]}];' Tôi chưa thử nghiệm điều này, nhưng nó có thể hoạt động – jzm

+0

Tôi không có quyền kiểm soát máy chủ đăng thông tin. Tôi đã thêm bản cập nhật ở trên. – lantram

+0

tại sao bạn chọn tên 'jsonData' ?, dữ liệu json có thể đến trên một tên khác, hãy thử kiểm tra FormCollection cho tên. – tkt986

Trả lời

50

cách tiếp cận ban đầu của bạn nên làm việc nếu bạn đi vào xem xét thực tế, rằng mô hình ASP.NET MVC ràng buộc đã đọc dòng, vì vậy bạn nên tua lại nó:

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

    // ... 
} 
+0

Tuyệt vời! Cảm ơn nhiều. Tôi biết phải có một giải pháp đơn giản. – lantram

+0

tính năng này hoạt động nhưng bất kỳ ý tưởng nào về http://stackoverflow.com/questions/21441571/get-post-request-parameters-in-custom-authorizeattribute này – PUG

0

Thiết lập lại position-Zero trước khi đọc dong chảy. Request.InputStream.Position = 0

Các vấn đề liên quan