C# URL已指定Id,但仍然获取参数字典包含参数';的空条目;Id';错误

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的类型或声明为 可

我理解这个错误是什么,以及典型的原因,但在这种情况下,我不知道为什么会抛出它

以下是完整的错误消息:

System.ArgumentException:参数字典包含空值 不可为空的类型为“System.Int32”的参数“Id”的条目,用于 方法'System.Threading.Tasks.Task'1[System.String] 已在中卸载应用程序(Int32) '店面.控制器.ShopifyWebhooksController'。可选的 参数必须是引用类型、可为null的类型或声明为 可选参数。参数名称:参数

针对我的应用程序调用的url是:
/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包?添加新控制器和/或操作?添加新的