我真的在努力解决一个非常简单的问题。我们正在接受我们的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);
答案 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);