程序异常 null“MediaTypeFormatter”无效 的原因及跟踪

环境:

本机功能测试没发现。

测试环境测试没发现。

正式环境,不断出现。

 

异常信息如下:

 

异常层级:0

错误信息:null“MediaTypeFormatter”无效。

Parameter name: formatters

异常对象:System.Net.Http.Formatting

错误堆栈:   at System.Net.Http.Formatting.MediaTypeFormatterCollection.VerifyAndSetFormatters(IEnumerable`1 formatters)

   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)

   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)

   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)

   at System.Web.Http.ModelBinding.FormatterParameterBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at System.Web.Http.Controllers.HttpActionBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()异常方法:Void VerifyAndSetFormatters(System.Collections.Generic.IEnumerable`1[System.Net.Http.Formatting.MediaTypeFormatter])

异常数据:{}

 

结果是,多次异常后:应用程序池有可能停止。

 

分析:从异常信息后,是有初始化参数时,无法正常接收分析参数导致的。

 

百度一下:无任何相关信息(谷哥也没有)。看来问题,比较SB别人都不会犯这个错。

 

 

为什么本机和测试中没出现?1运行环境有问题2代码有问题

 

正式环境之前的版本是正常的,所以应该可以排除。那么就是代码有问题。

可排查了好久,没能发现问题在那。

那本地和正式的有何不同?并发

 

找原因方法:并发测试

本地是没有并发测试的,正式并发大。所以只好模拟并发请求相关接口。

 

结果-----内存溢出。我X。

我这里提web api (你的可能不一样呢)

其中有如下代码 

 

protected override void Initialize(HttpControllerContext controllerContext)
{

        controllerContext.Configuration.Formatters.Add(new FileMediaFormatter());
        base.Initialize(controllerContext);
}

没相到这个不是基于请求的,它会一直累加。(为什么?希望大神,来说明下---)
解决方法:1将这个添加放在全局(我这里好像不行,会导致其它问题)

              2确保不累加进去。方法就不说了。

 

 

 

结论:找Bug也是一下痛苦的事。

 

第一个文章,希望是个好开始

 

转载于:https://www.cnblogs.com/hcrain/p/5680032.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个异常通常是因为你在使用反射设置某个对象的属性值时,将要设置的值为null,但是该属性的类型不支持null值,导致了异常的抛出。 比如,如果你有一个类A,其中有一个属性name,它的类型为String,那么你使用反射设置name的值时,如果将要设置的值为null,就会抛出这个异常。 解决方法是在设置属性值之前,先判断该属性是否支持null值,如果不支持,就需要给它一个默认值或者抛出异常提示。 ### 回答2: 在Java中,反射是一种强大的机制,可以在运行时动态地获取类的信息并调用其方法。使用反射时,可以通过getMethod或getField等方法获取对应的方法或字段对象,然后通过invoke来调用方法或设置字段的值。 当尝试通过反射设置一个对象的字段值时,如果所提供的值为null,可能会抛出"can not to set null value"异常。造成此异常原因一般有以下几种情况: 1. 非空字段:如果要设置的字段是Java类中定义的非空字段,并且使用反射来为其设置值时,如果提供的值为null,就会抛出该异常。 例如,假设有一个类Person,其中定义了一个名为name的字段,并且在构造方法中初始化了name字段。如果使用反射来设置name字段的值,而提供的值为null,就会抛出"can not to set null value"异常。 2. 安全限制:如果当前运行的代码处于安全管理器的控制下,并且具有相应的限制策略,可能会禁止通过反射为某些字段设置null值,从而导致该异常的抛出。 3. 字段不可访问:如果要设置的字段是私有字段或受保护字段,并且没有通过setAccessible方法设置可访问性,就无法通过反射来设置null值,也会抛出该异常。 总的来说,"can not to set null value"异常在反射中常见于对非空字段的null赋值,安全限制或字段不可访问等情况。为了避免该异常的抛出,可以在使用反射设置字段的值之前,先判断字段是否可以为空,或者对字段进行null值的处理。 ### 回答3: 反射无法设置空值的异常原因是因为在反射过程中,我们通常要先获取到某个类的属性或方法,然后再对其进行设置或调用。当我们使用反射设置某个属性的值时,值不能为空。 在Java中,反射是通过`Field`类中的`set`方法来设置属性的值。`set`方法的定义是`void set(Object obj, Object value)`,其中`obj`是属性所属的对象,而`value`是要设置的值。由于Java是一种强类型语言,所有的值都必须具体指定其类型,因此不能设置为空。 如果我们尝试使用`set`方法来设置空值,就会抛出`NullPointerException`异常,因为反射无法将空值引用转换为某个具体的类型。 为了避免这个异常,我们可以在设置属性值之前,对要设置的值进行非空判断。如果值为空,可以选择设置默认值或抛出异常。另外,我们还可以使用`Field`类中的`getType`方法来获取属性的类型,从而在设置属性值时选择合适的类型转换方式。 总之,反射无法设置空值的异常原因是因为反射过程中要求所有的值都必须具体指定其类型,而空值无法指定具体类型,因此会抛出异常。为了规避该异常,我们可以进行非空判断或使用合适的类型转换方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值