如何在 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);

如何在 C# 4.0 中使用应用程序/json 的内容类型读取 HTTP Post 数据

您可以使用原始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);