如何在 C# 4.0 中使用应用程序/json 的内容类型读取 HTTP Post 数据
本文关键字:json 类型 读取 数据 Post HTTP 应用程序 | 更新日期: 2023-09-27 17:56:20
我真的在为一个非常简单的问题而苦苦挣扎。 我们接受 HTTP POST 到我们的 API。 直到今天,当我们试图进入身体时,一切都很好。
我们尝试接收在 HTTP 标头中具有以下值的 POST:内容类型:应用程序/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);
您可以使用原始HttpContext
而不是对流的引用吗?
或者可能从此堆栈溢出答案中获取应用程序实例的上下文。
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
代码中的错误似乎是第一行。 代码将 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);