首页 > 解决方案 > Json Web API 绑定到模型有时会引发异常

问题描述

我有一个 WebAPI(不确定是什么版本,但它是在 VS2017 中创建的),它接收 Json 字符串并将其绑定到控制器中的模型。大多数时候这工作得很好。有时它会在我第一次尝试访问类实例时抛出异常。很明显,绑定例程失败,但异常消息无济于事:对象引用未设置为对象的实例。我猜测活页夹失败了,甚至没有创建我的对象的空实例。

我在调用 API 之前记录了 Json 字符串,以便查看字符串是否存在问题。我已经确定某些 unicode 符号(例如商标 TM)会导致失败,因此我正在管理这些符号。

但是我最近有几个抛出异常的 Json 字符串,我不知道为什么。我找不到任何 unicode 符号。现在我的用户在问为什么这种特定的工作风格会失败。

似乎一旦 InputStream 被内部 MVC 绑定例程读取,就再也无法读取了。诀窍:

HttpContext.Current.Request.InputStream.Position = 0;
string streamresult = new System.IO.StreamReader(HttpContext.Current.Request.GetBufferedInputStream()).ReadToEnd();

抛出它自己的异常,说调用是在“内部存储被 HttpRequest.GetBufferedInputStream 的调用者填充”之前进行的。

标签: c#asp.net-web-apimodel-view-controller

解决方案


如果要读取请求正文,则需要在其流上启用倒带,否则请求正文只能读取一次,因为默认情况下它是只进的流。

如果您使用的是 ASP.NET Core MVC,则可以使用以下命令启用启动代码的倒带:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) => {  // <----
        context.Request.EnableRewind();
        await next();
    });

    app.UseMvc();
}

最后一点,我可以推荐Audit.NET库及其Audit.WebApi扩展。


推荐阅读