В URL указан Id, но при этом словарь параметров содержит пустую запись для ошибки параметра Id - PullRequest
1 голос
/ 06 марта 2019

Я понимаю, что говорит об этой ошибке и типичная причина, но в этом случае я не уверен, почему она выбрасывается.

Вот полное сообщение об ошибке:

System.ArgumentException: словарь параметров содержит нуль запись для параметра 'Id' необнуляемого типа 'System.Int32' для метод 'System.Threading.Tasks.Task`1 [System.String] AppUninstalled (Int32) 'в 'Storefront.Controllers.ShopifyWebhooksController. Необязательный Параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр. Имя параметра: параметры

URL, вызываемый для моего приложения: /storefront/wh/AppUninstalled/88564. Таким образом, он передает идентификатор как int.

Вот определение маршрута:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Storefront_default",
        "Storefront/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

Вот подпись действия, которая вызывается: public async Task<string> AppUninstalled(int id)

Теперь, когда я проверяю это локально или на своем промежуточном сервере с помощью Postman, я не получаю эту ошибку. Но когда Shopify звонит, я получаю ошибку. И я могу проверить с помощью сгенерированной ошибки Elmah, что URL, который был вызван, такой же, как я опубликовал выше, с конечным значением Id.

ОБНОВЛЕНИЕ: 1

Я также пытался сделать так, чтобы shopify вызывал URL с явно заданным идентификатором: /storefront/wh/AppUninstalled?id=88564, но получал ту же ошибку.

Может ли быть что-то в кодировке, что MVC не может преобразовать id в int?

ОБНОВЛЕНИЕ 2

Это работает, но не объясняет, почему вышеприведенное не сработало.

Изменение метода действия в MVC на: public async Task<string> AppUninstalled(string strId)

Изменение URL обратного вызова Shopify на: /storefront/wh/AppUninstalled?strId=88564

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Не могли бы вы попробовать 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 
});
0 голосов
/ 06 марта 2019

Я подозреваю, что, поскольку id объявлен необязательным в MapRoute, вы должны объявить свое действие следующим образом:

public async Task<string> AppUninstalled(int? id)

И проверьте, имеет ли id значение, и примите меры, если нет.

...