我有一個使用MVC4構建的面向互聯網的網站,我偶爾會從漫遊器或好奇的用戶那裏獲取錯誤報告,這些用戶發送不完整的URL請求。忽略由於缺少控制器參數導致的異常
例如:
public class ProductController : Controller
{
[HttpGet]
public void View(int id)
{
// ...
- GET請求到
/product/view/1
是有效的。 - 由於未指定參數,所以對
/product/view
的GET請求無效。
這種無效的請求,引發異常相似:
System.ArgumentException: The parameters dictionary contains a null entry
for parameter 'id' of non-nullable type 'System.Int32' for method
'System.Web.Mvc.ActionResult View(Int32)' in 'Foo.ProductController'. An
optional parameter must be a reference type, a nullable type, or be declared
as an optional parameter.
Parameter name: parameters
at System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo)
at System.Web.Mvc.ReflectedActionDescriptor.<>c__DisplayClass1.<Execute>b__0(ParameterInfo parameterInfo)
...
由於異常消息的狀態,我可以使id
參數空,但操作方法內檢查,但我有許多控制器與許多行動。
我想返回一個BadRequest
/NotFound
對任何無法將參數綁定到操作參數的請求的響應,並在代碼中的一個位置指定此值以跨所有控制器應用。
這怎麼辦?
在你定義控制器和動作和參數定義的路由配置中,你可以指定參數爲可空。 –
@AnirudhAgarwal當嘗試將null轉換爲int時,可能會拋出int –
@AirirhAgarwal,如果我爲'id'包含一個我不想做的默認值,那麼工作的唯一方法就是。如果在操作中定義了「id」並且它沒有提供,那麼客戶端犯了一個錯誤,我想給他們發送404。另外,我有各種不同的控制器,每個控制器都需要在我的路由配置中輸入。這裏的要點是,我不希望在我的操作和配置中進行自定義更改,以防萬一某個用戶/機器人發送無效請求 - 它們應該集中處理,並且不會引發導致我收到錯誤電子郵件的異常只需刪除。 –