我有一个WebAPI(不确定是哪个版本,但它是在VS2017中创建的),该API接收Json字符串并将其绑定到控制器中的模型。在大多数情况下,这都很好。有时,当我第一次尝试访问类实例时,它将引发异常。很明显,绑定例程失败,但是异常消息没有帮助:对象引用未设置为对象的实例。我猜测绑定程序失败了,甚至没有创建对象的空实例。
我在调用API之前记录了Json字符串,因此我可以查看字符串中的问题。我已经确定某些Unicode符号(例如商标TM)会导致失败,因此我将对其进行管理。
但是我最近有几个Json字符串引发了异常,我不知道为什么。我找不到unicode符号。现在我的用户在问为什么这种特定的工作方式失败了。
似乎内部MVC绑定例程读取了InputStream之后,就再也无法读取它了。的窍门:
HttpContext.Current.Request.InputStream.Position = 0;
string streamresult = new System.IO.StreamReader(HttpContext.Current.Request.GetBufferedInputStream()).ReadToEnd();
抛出自己的异常,说在“内部存储由HttpRequest.GetBufferedInputStream的调用者填充”之前进行了调用。
答案 0 :(得分:0)
如果您想读取请求正文,则需要在其流上启用 rewind ,否则请求正文只能被读取一次,因为默认情况下,它是仅向前的流。
如果您使用的是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库。