Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance ASP.NET MVC:这怎么可能?参数字典包含参数';x';_Performance_Asp.net Mvc 3 - Fatal编程技术网

Performance ASP.NET MVC:这怎么可能?参数字典包含参数';x';

Performance ASP.NET MVC:这怎么可能?参数字典包含参数';x';,performance,asp.net-mvc-3,Performance,Asp.net Mvc 3,我想知道是否有人对这里发生的事情有所了解,并能为我指明正确的方向 好的,让我们把代码放到上下文中 我有如下ajax方法(jquery): $xmlHttp("/Api/GetWaitingMessages", { count: 20 }) .always(processResult); Exception information: Exception type: System.ArgumentException Exception message: The parameters dic

我想知道是否有人对这里发生的事情有所了解,并能为我指明正确的方向

好的,让我们把代码放到上下文中

我有如下ajax方法(jquery):

$xmlHttp("/Api/GetWaitingMessages", { count: 20 })
    .always(processResult);
Exception information:
Exception type: System.ArgumentException
Exception message: The parameters dictionary contains a null entry for parameter 'count' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult GetWaitingMessages(Int32)' in 'AjaxController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters
($xmlHttp只是简单地包装了一个延迟的jQuery,以及一些基本的$ajax选项)

在我们的健康监控后台,我看到了这样的事情:

$xmlHttp("/Api/GetWaitingMessages", { count: 20 })
    .always(processResult);
Exception information:
Exception type: System.ArgumentException
Exception message: The parameters dictionary contains a null entry for parameter 'count' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult GetWaitingMessages(Int32)' in 'AjaxController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters
现在的问题是,我放置了一些跟踪和try/catch(用于测试),以确保jQuery从不使用空的或未定义的“count”调用GetWaitingMessages,但就healthmonitoring实例而言:GetWaitingMessages被实例化并作为参数传递null。(据我所知,MVC通过反射实例化方法)

顺便说一句:在数千个请求中,可能只有一个错误发生

GetWaitingMessages的签名为:

public virtual ActionResult GetWaitingMessages(int count)
{
    ....
}
所以我想,mvc甚至不应该点击这个方法,因为不应该有签名匹配

MVC是否存在高流量网站问题(即多线程问题)

上面提到的站点运行在由5台web场服务器组成的集群上,具有网络负载平衡和IP关联性

每台服务器在高峰时间获得大约1500个请求/秒

该网站使用url重写将域映射到区域(即test.com将简单地插入/测试url),因为它是一个可皮肤化的多语言白标签网站

有关站点配置的更多详细信息:

为ajax请求提供服务的控制器用

[SessionState(SessionStateBehavior.Disabled)]
由于需要在MVC中运行:runAllManagedModulesForAllRequests=“true”,因此被视为无用的HttpModules被删除。我本可以设置runAllManagedModulesForAllRequests=“false”,然后尝试找出要添加的内容、顺序,但发现只删除我知道不必要的内容更简单

<remove name="AnonymousIdentification" />
<remove name="Profile" />
<remove name="WindowsAuthentication" />
<remove name="UrlMappingsModule" />
<remove name="FileAuthorization" />
<remove name="RoleManager" />
<remove name="Session" />
<remove name="UrlAuthorization" />
<remove name="ScriptModule-4.0" />
<remove name="FormsAuthentication" />   

以下都是在web.config中激活和配置的

<pages validateRequest="false" enableEventValidation="false" enableViewStateMac="true" clientIDMode="Static">   

and also:
urlCompression
staticContent
caching
outputCache

而且:
URL压缩
静态内容
缓存
输出缓存
编辑:只是进一步分析了我的跟踪日志。当错误发生时,我看到(内容长度:8),它对应于(count=20)。但是,我在日志中没有看到任何查询参数。我将HttpInputStream转储到日志中,它是完全空的..但是正如我刚才提到的,日志也说Content Length=8,所以这里有点非常错误

IIS(最终url重写)会不会在某个地方把它的东西混在一起

-

任何帮助都将不胜感激1.我正在绞尽脑汁想弄清楚这里可能出了什么问题


谢谢,Robert

您的
xmlHttp
向服务器发出什么类型的请求(
GET
POST
或其他)

GetWaitingMessages
action方法的定义是什么


很可能是接受的动词或参数名称不匹配。

我觉得这可能是MVC无法绑定到“count”参数的问题。默认情况下,它希望参数名为“id”

您可以尝试以下操作:

  • 修改GetWaitingMessages操作,使用名为“id”而不是“count”的参数来定义它
  • 创建自定义模型绑定,如对stackoverflow问题的接受答案中所述
  • 希望这有帮助


    编辑:刚刚看到你对另一个回答的回复,说这个动作是一个帖子。在这种情况下,绑定可能不是问题。

    仅用于测试,请尝试此操作,看看是否存在任何问题

    public virtual ActionResult GetWaitingMessages(FormCollection form)
    {
      var count=Int32.Parse(form["count"]);
    
      ....
    }
    

    当然,如果未设置计数字段,它将抛出。如果它总是正常工作,那么问题在于路由或模型绑定

    所有ajax请求都是POST,healthmonitoring跟踪中的服务器变量显示失败方法的请求也在POST中,所以这似乎很好。我尝试的是在ajax请求上添加if,以确保没有请求离开if计数!=20,但是请求确实执行了,因此我假设count=20,但仍然会发生错误。所以我假设错误一定在服务器端。GetWaitingMessages()只是受此行为影响的许多其他方法的一个示例:(这个问题不是系统性地发生的,但更像是千分之一的人知道有多少个请求……但是,是的,谢谢,我会看看这是否会改变什么!在看到你的回复后,将测试放在网上,并得到我的前几个错误。奇怪的是,我的跟踪显示“内容长度:8”,与表单参数完全对应(计数=20)。您认为url重写可能会或不太可能会在这里玩一些有趣的把戏吗?谢谢您是否使用IIS 7+?我更喜欢在应用程序中处理url重写。目前,我正在开发一个多租户可皮肤化应用程序,我已经实现了自己的url重写,以将a请求映射到常见路由格式“租户/控制器/操作”。这是一段非常棘手的代码,但到目前为止,在我的测试中,它工作正常(但还没有在真正高度并发的情况下进行测试)。是的,我们在2008 r2上(我在第一篇文章中添加了一些配置设置)。我们的旧站点使用自定义重写和ajaxPro(但在ajaxPro实例化带有空参数的方法时也有类似的错误)。我刚刚完成了对MVC的重写,以便能够利用我们对区域和共享文件夹(用于皮肤)的继承,以及MVC控制器(ajax)提供的本机序列化,模型绑定/验证,当然还有其他好处。尝试其他方法。当count似乎缺少记录有关请求的所有信息时。如果jquery正确发送所有信息,而asp.net没有收到实际参数,我怀疑正在进行一些筛选,可能是负载平衡器出了问题?!我会记录所有信息,结果如下:1)调用了GetWaitingMessages