如何在C#4.0中读取内容类型为application / json的HTTP Post数据

时间:2014-04-02 20:25:31

标签: c# json asp.net-mvc-3 asp.net-mvc-4

我真的在努力解决一个非常简单的问题。我们正在接受我们的API的HTTP POST。当我们试图访问Body直到今天,一切都很好。

我们正在尝试接收在HTTP标头中具有以下值的POST:content-type:application / json

关于该值的一些事情导致byteArray只包含NULL值。尽管如此,数组大小仍然正确。只需将内容类型更改为其他任何内容即可修复问题(application / jso,application \ json等),以便触发该值。我们可以接受其他JSON,但没有该标头值。

我们正在使用MVC3,我尝试升级到MVC4,这似乎没有帮助。我们还构建了自己的控制器,但是我们对内容类型的HTTP头没有做任何事情。我很欣赏任何想法,看看为什么会发生这种情况。

HttpContextBase httpContext = HttpContext;

 if (!httpContext.IsPostNotification)
 {
    throw new InvalidOperationException("Only POST messages allowed on this resource");
 }

 Stream httpBodyStream = httpContext.Request.InputStream;

 if (httpBodyStream.Length > int.MaxValue)
 {
    throw new ArgumentException("HTTP InputStream too large.");
 }

 int streamLength = Convert.ToInt32(httpBodyStream.Length);
 byte[] byteArray = new byte[streamLength];
 const int startAt = 0;

 httpBodyStream.Read(byteArray, startAt, streamLength);
 httpBodyStream.Seek(0, SeekOrigin.Begin);

 switch (httpContext.Request.ContentEncoding.BodyName)
 {
    case "utf-8":
        _postData = Encoding.UTF8.GetString(byteArray);

2 个答案:

答案 0 :(得分:2)

您是否可以使用原始HttpContext代替对流的引用。

或者可能从this堆栈溢出回答中获取应用程序实例的上下文。

// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;

答案 1 :(得分:1)

代码中的错误似乎是第一行。代码将HttpContext分配给名为httpContext的局部变量。由于我不知道的原因,通过删除此行并直接使用HttpContext,代码可以正常工作。

if (!HttpContext.IsPostNotification)
    throw new InvalidOperationException("Only POST messages allowed on this resource");

HttpContext.Request.InputStream.Position = 0;

if (HttpContext.Request.InputStream.Length > int.MaxValue)
    throw new ArgumentException("HTTP InputStream too large.");

int streamLength = Convert.ToInt32(HttpContext.Request.InputStream.Length);
byte[] byteArray = new byte[streamLength];
const int startAt = 0;

HttpContext.Request.InputStream.Read(byteArray, startAt, streamLength);
HttpContext.Request.InputStream.Seek(0, SeekOrigin.Begin);

switch (HttpContext.Request.ContentEncoding.BodyName)
{
    case "utf-8":
        _postData = Encoding.UTF8.GetString(byteArray);