C# URL已指定Id,但仍然获取参数字典包含参数';的空条目;Id';错误
我理解这个错误是什么,以及典型的原因,但在这种情况下,我不知道为什么会抛出它 以下是完整的错误消息: System.ArgumentException:参数字典包含空值 不可为空的类型为“System.Int32”的参数“Id”的条目,用于 方法'System.Threading.Tasks.Task'1[System.String] 已在中卸载应用程序(Int32) '店面.控制器.ShopifyWebhooksController'。可选的 参数必须是引用类型、可为null的类型或声明为 可选参数。参数名称:参数 针对我的应用程序调用的url是:C# URL已指定Id,但仍然获取参数字典包含参数';的空条目;Id';错误,c#,asp.net-web-api,asp.net-mvc-5,shopify,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Mvc 5,Shopify,Asp.net Web Api Routing,我理解这个错误是什么,以及典型的原因,但在这种情况下,我不知道为什么会抛出它 以下是完整的错误消息: System.ArgumentException:参数字典包含空值 不可为空的类型为“System.Int32”的参数“Id”的条目,用于 方法'System.Threading.Tasks.Task'1[System.String] 已在中卸载应用程序(Int32) '店面.控制器.ShopifyWebhooksController'。可选的 参数必须是引用类型、可为null的类型或声明为 可
/storefront/wh/AppUninstalled/88564
。因此它将Id作为int传递
以下是路线定义:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Storefront_default",
"Storefront/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
下面是正在调用的操作签名:public async Task AppUninstalled(int-id)
现在,当我在本地或使用Postman对我的登台服务器进行测试时,我没有发现这个错误。但是当Shopify调用它时,我确实得到了错误。我可以通过生成的Elmah错误来验证调用的url是否与我在上面发布的url一样,带有尾随Id值
更新:1
我还尝试让shopify调用id显式命名为:/storefront/wh/AppUninstalled?id=88564
的url,但得到了相同的错误
可能是编码中的某种东西使MVC无法将id转换为int吗
更新2
这是可行的,但它不能解释为什么上述方法不起作用
将MVC中的操作方法更改为:public async Task AppUninstalled(string strId)
将Shopify回拨url更改为:
/storefront/wh/AppUninstalled?strId=88564
我怀疑,既然id
在MapRoute
中声明为可选,您应该这样声明您的操作:
public async Task<string> AppUninstalled(int? id)
public异步任务AppUninstalled(int?id)
检查
id
是否有值,如果没有,则采取行动。我怀疑,既然id
在MapRoute
中声明为可选,您应该这样声明您的行动:
public async Task<string> AppUninstalled(int? id)
public异步任务AppUninstalled(int?id)
并检查
id
是否有值,如果没有,则采取措施。是否可以尝试RouteParameter.Optional
和MapHttpRoute
而不是UrlParameter.Optional
和MapRoute
routes.MapHttpRoute( // <-- this
name: "Storefront_default",
routeTemplate: "Storefront/{controller}/{action}/{id}",
defaults: new {action ="Index", id = RouteParameter.Optional // <-- this
});
routes.MapHttpRoute(//你能试试RouteParameter.Optional
和MapHttpRoute
而不是UrlParameter.Optional
和MapRoute
routes.MapHttpRoute( // <-- this
name: "Storefront_default",
routeTemplate: "Storefront/{controller}/{action}/{id}",
defaults: new {action ="Index", id = RouteParameter.Optional // <-- this
});
routes.MapHttpRoute(//您是否尝试了int-id?不是int-id(大写I)您是否尝试了public async Task AppUninstalled(int-id)
?您是通过ajax还是在navbar中调用/storefront/wh/appunnstalled/88564的?@FatikhanGasimov-我试过了…仍然得到了错误…尽管它确实识别出了错误,但我改变了它:参数字典包含一个空条目,用于参数“id”的不可为空类型的系统。Int32'f
@HienNguyen-与邮递员应用程序一起,使用一个post作为method用[HttpPost]
修饰您是否尝试了int-id?而不是int-id(大写I)您是否尝试了公共异步任务AppUninstalled(int?id)
?您是通过ajax还是在navbar中调用/storefront/wh/appunnstalled/88564的?@FatikhanGasimov-我试过了…仍然得到了错误…尽管它确实识别出了错误,但我改变了它:参数字典包含一个空条目,用于参数“id”的不可为空类型的系统。Int32'f
@HienNguyen-与邮递员应用程序一起,使用一个post作为method用[HttpPost]装饰
context
没有MapHttpRoute
。我确实更改了RouteParameter。可选的
,现在正在测试。看看我的更新,我也尝试显式添加参数querystring…但没有效果。context
没有MapHttpRoute
。我确实更改了路由Parameter.Optional
我现在正在测试。看看我的更新,我也尝试显式添加参数querystring…但没有效果。谢谢你的建议,但我不认为是这样。可选的是说明某些操作可能没有Id…即索引操作没有,但编辑有。我使用相同的路由在out site内的15个不同区域中配置使用不可为null的int参数的操作,多年来一直运行良好。但感谢您的建议。@ChadRichardson Ok,但您尝试过吗?我强烈怀疑这可能会起作用,因为当您将参数类型更改为string
,这是巧合一个可为空的类型。但是,它不会解释为什么这会起作用。@ChadRichardson您说它已经起作用好几年了。您最近做了哪些更改使这个错误发生?修改/添加路由?更新aspnet包?添加新控制器和/或操作?添加新区域?您还想到了什么吗?谢谢或者发现了建议,但我不认为是这样。可选的是说明某些操作可能没有Id…即索引操作没有,但编辑有。我在out site内的15个不同区域使用相同的路由配置,这些操作使用不可为null的int参数,多年来一直运行良好。但是谢谢你的建议。@ChadRichardson好的,但你试过了吗?我强烈怀疑这可能有效,因为当你将参数类型更改为string
,这恰好是一个可为空的类型时,它起作用了。但是,它将毫无解释为什么这会起作用。@ChadRichardson你说它已经起作用多年了。你做了哪些更改最近发生此错误?修改/添加路由?更新aspnet包?添加新控制器和/或操作?添加新的