2012-03-26 81 views
4

我想知道是否有人对这里发生的事情有线索,并可能指向正确的方向。ASP.NET MVC:这怎么可能?参数字典包含参数“x”的空条目

好的..lets将代码放在上下文中。

我有AJAX方法(jQuery的)类似这样:

$xmlHttp("/Api/GetWaitingMessages", { count: 20 }) 
    .always(processResult); 

($ XMLHTTP只是封装一个jQuery延迟执行,以及一些基本的$ AJAX选项)

而在我们healthmonitoring后台我见事情是这样的:

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 

现在的事情是,我把一些痕迹&尝试/捕获(用于测试),以确保jQuery的永远不会调用GetWaitingMess年龄有一个空的或未定义的“计数”,但就healthmonitoring exeptions去:GetWaitingMessages被实例化并作为参数传递null。 (据我所知,MVC实例通过反射法)

BTW:该错误仅发生一样,也许1出成千上万的请求

GetWaitingMessages的签名是:

​​

所以我想,MV​​C不应该击中该方法,因为应该没有签名匹配。

MVC是否有高流量网站(即多线程问题)的问题?

上述网站运行在具有网络负载平衡和IP关联性的5个Web服务器场服务器群集上。

每个服务器在高峰时间约有1500个请求/秒。

该网站使用的URL重写,因为它是一个可换肤&多种语言的白色标签网站地图域的区域(即test.com将只需插入/测试到URL)。

现场配置更多的细节:

,供应Ajax请求饰有

[SessionState(SessionStateBehavior.Disabled)] 

的HttpModules但如认为是无用的,其中删除,因为我们需要运行控制器:runAllManagedModulesForAllRequests = MVC中的“true”。我可以设置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 

编辑:只是分析了我跟踪日志的详细一点。当发生错误时,我看到(Content-Length:8),它对应于(count = 20)。但是,我没有看到日志中的任何查询参数。我将HttpInputStream转储到了日志中,而且它完全是空的......但就像我刚才提到的那样,日志也会说Content-Length = 8,所以这里有些错误。

难道IIS(最终URL重写)将它的东西的地方,一路上混淆?

-

任何帮助,将不胜感激..i'm撕扯我的头发试图了解可能被错误怎么回事。

谢谢,罗伯特

+0

这里谈到因为是Q被删除:“我敢肯定,我没有看错了(不是我同意)..also找不到链接,但如果你在Google上搜索‘异步50ms的’” - 对,如果你的谷歌的“异步50毫秒”,你会发现一堆有关异步/等待和50毫秒,这与多线程编程无关的线程:-)“异步和等待关键字不会导致创建额外的线程” (c)中http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_Threads – zerkms 2013-07-08 04:43:34

+0

当使用异步/等待你在逻辑使用函数与返回类型任务/任务的,其创建线程。所以虽然关键字并不意味着自己的多线程,但它们只能在多线程上下文中使用(Task <>)。 – Robert 2013-07-08 14:20:26

+0

对不起为是insistant,但我还没有看到一个异步/ AWAIT组合然而不等待任务<> – Robert 2013-07-08 14:23:29

回答

0

什么类型的请求中,贵xmlHttp问题到服务器(GETPOST或别的东西)?

什么是GetWaitingMessages操作方法的定义是什么?

这可能是由于接受的动词或参数名称不匹配造成的。

+0

所有的AJAX请求是POST,并在healthmonitoring跟踪显示服务器变量为失败的方法的请求也在POST中,所以看起来很好。 – Robert 2012-03-26 09:58:22

+0

我做了什么尝试,是把一个如果对阿贾克斯请求,以确保没有请求离开,如果计数!= 20,但是请求确实发生,所以我认为count = 20,但是错误仍然会发生。所以我假设错误必须在服务器端。 GetWaitingMessages()只是这种行为影响许多其他方法的一个例子:( – Robert 2012-03-26 10:11:10

0

我有一种感觉,这可能是与MVC不能够绑定到你的“计数”参数的问题。默认情况下,它期望该参数被命名为'id'。

你可以尝试以下方法:

  1. 修改您GetWaitingMessages行动,与调用,而不是“数”“ID”参数来定义它
  2. 创建自定义模型作为公认的答案所描述的结合在asp.net mvc routing id parameter

希望计算器问题,这有助于

编辑:刚才看到你的回复到另一个swer声明行动是一个POST。在这种情况下,绑定可能不是问题。

+0

这个问题并没有系统地发生,但更像是1谁知道有多少数千请求..但是,谢谢,我会看到如果这个改变任何东西 – Robert 2012-03-26 10:04:53

0

只是为了测试尝试这个,看看是否有任何问题。

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

    .... 
} 

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

+0

感谢,会给这个尝试 – Robert 2012-03-26 11:05:19

+0

把测试刚刚看到您的回复后网上,并得到了我的第一对夫妇的错误的请告诉我奇怪的是,我的跟踪显示“内容长度:8!”,这与完美对应形式参数(数= 20)。你认为它有可能或非常不可能的URL重写可能在这里打搞笑招数?谢谢 – Robert 2012-03-26 11:59:24

+0

是否使用IIS 7+?我更喜欢处理的URL在应用程序重写。目前我正在开发多租户的skinable应用程序,我已经实现了我自己的URL重写映射到一个共同的路线格式“租户/控制器/行动”的要求,这是一个非常棘手的一块鳕鱼E,但在我的测试,到目前为止它工作正常(但它是不是还没有一个真正的高并发的情况下测试) – MikeSW 2012-03-26 12:09:39

相关问题