簡體   English   中英

在ASP.NET CORE中將屬性路由值轉換為Model / FromBody參數

[英]Attribute Routing Values into Model/FromBody Parameter in ASP.NET CORE

我正在開發.NET核心Web API應用程序,在該應用程序中我希望URL路由值進入Model / FromBody參數。 如果發件人模型中存在路由屬性。

有沒有通用的解決方案,即適用於所有模型類型。

我們已經找到了自定義模型綁定器,但是它適用於特定於模型類型的綁定器。 我正在尋找適用於所有模型類型的自定義模型活頁夾。

例如:

Action route: [Route("AH/{userId}")]
Url : ../AH/123
From body: 
{
"userId":"",
"Value" : "Some value"
}

現在,路由值123需要映射到FromBody模型屬性“ userId”

您無法從請求正文中填充路線參數。 路由參數是URL的一部分,因此必須獨立於實際發布的正文而存在。

無論如何,您永遠都不應信任來自發帖請求正文的ID之類的東西。 始終從URL獲取該信息。 該URL定義了唯一資源,因此發布到該URL只能影響該唯一資源。 如果您依賴發布主體,則惡意用戶可以操縱發布的值來潛在地更改他們不應該訪問的資源。

對於您當前的請求, "userId":""將使請求失敗,因為""無法轉換為int值。

為了滿足您的要求,可以在模型綁定之前通過以下步驟修改請求正文:

  1. ModelResourceFilterAttribute

     public class ModelResourceFilterAttribute : Attribute, IResourceFilter { public void OnResourceExecuted(ResourceExecutedContext context) { } public void OnResourceExecuting(ResourceExecutingContext context) { context.HttpContext.Request.EnableRewind(); var routeData = context.RouteData; var stream = context.HttpContext.Request.Body; using (var streamReader = new StreamReader(context.HttpContext.Request.Body)) { var json = streamReader.ReadToEnd(); if (json != "") { var jsonObj = JObject.Parse(json); foreach (var item in routeData.Values) { JToken token; if (jsonObj.TryGetValue( item.Key, StringComparison.InvariantCultureIgnoreCase, out token)) { var jProperty = token.Parent as JProperty; if (jProperty != null) { jProperty.Value = item.Value.ToString(); } } } var body = jsonObj.ToString(Formatting.Indented); byte[] byteArray = Encoding.UTF8.GetBytes(body); //byte[] byteArray = Encoding.ASCII.GetBytes(contents); context.HttpContext.Request.Body = new MemoryStream(byteArray); } } } } 
  2. 注冊ModelResourceFilterAttribute

     services.AddMvc(options => { options.Filters.Add(typeof(ModelResourceFilterAttribute)); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM