第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 ASP.NET Core 中手動綁定表單數(shù)據(jù)

在 ASP.NET Core 中手動綁定表單數(shù)據(jù)

C#
拉丁的傳說 2021-11-28 20:03:13
我有一個 web api,其中包含一些應該同時接收數(shù)據(jù)和文件的操作。為此,我接受 multipart/form-data 而不是 JSON 并使用[FromForm]以下方法綁定到模型:[Authorize(Policy = "MyCustomPolicy")]public async Task<IActionResult> Create([FromForm]MyCustomDto myDto){    // Do some stuff here}public class MyCustomDto{    public int Id { get; set; }    public string Title { get; set; }    public IEnumerable<IFormFile> Attachments { get; set; }}這工作正常并且正確綁定到 DTO。使用 AuthorizationHandler 檢查和強制執(zhí)行策略,它也可以正常工作。在上述 AuthorizationHandler 中,我需要訪問一些傳遞給控制器的東西,例如路由中的 ID 或 DTO。使用 訪問路線數(shù)據(jù)非常容易authContext.RouteData.Values["nameOfIdField"]。但是,對于正文,我創(chuàng)建了一個輔助擴展方法,用于讀取正文流并將其反序列化:public static async Task<T> DeserializeBody<T>(this AuthorizationFilterContext context, string name){    var content = string.Empty;    using(var reader = new StreamReader(context.HttpContext.Request.Body, System.Text.Encoding.UTF8, true, 1024, true))    {        content = await reader.ReadToEndAsync();        reader.BaseStream.Seek(0, SeekOrigin.Begin);    }    if (string.IsNullOrWhiteSpace(content))    {        return default(T);    }    return JsonConvert.DeserializeObject<T>(content);}同樣,這也很好用。但是,現(xiàn)在我遇到了 DTO 的問題,這些 DTO 不是作為 JSON 傳遞的,而是 - 正如開頭所說的 - 作為表單數(shù)據(jù)。正文的內容不是可以輕松序列化的 JSON:-----------------------------7e2b13b820d4aContent-Disposition: form-data; name="id"232  -----------------------------7e2b13b820d4aContent-Disposition: form-data; name="title"test  -----------------------------7e2b13b820d4aContent-Disposition: form-data; name="attachments"; filename="C:\Temp\Test.jpg"Content-Type: image/jpeg有什么方法可以輕松地將它綁定到我的 DTO,而無需手動解析它?
查看完整描述

2 回答

?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

你最好在你的操作方法中處理這種情況:


public class SomeController : Controller

{

    private readonly IAuthorizationService _authorizationService;


    public SomeController(IAuthorizationService authorizationService)

    {

        _authorizationService = authorizationService;

    }


    public async Task<IActionResult> Create([FromForm]MyCustomDto myDto)

    {

        var authorizationResult = await _authorizationService.AuthorizeAsync(User, myDto, "MyCustomPolicy");

        if (!authorizationResult.Succeeded)

            return User.Identity.IsAuthenticated ? Forbid() : (IActionResult)Challenge();


        // Do some stuff here

    }

你像這樣定義你的授權處理程序:


public class MyCustomDtoAuthorizationHandler : AuthorizationHandler<MyCustomDtoRequirement, MyCustomDto>

{

    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyCustomDtoRequirement requirement, MyCustomDto resource)

    {

        // your authorization logic based on the resource argument...

    }

}

選擇AuthorizeFilter方式的一個大問題是授權過濾器在模型綁定發(fā)生之前執(zhí)行。(只需查看ResourceInvoker類的源代碼。)您需要手動綁定模型以訪問其中授權所需的信息。然后框架會完成它的工作,導致模型綁定被完成兩次,從而導致性能下降。正如前面所描述的那樣,這應該并且可以避免。


更新


我剛剛注意到我不小心在 action 方法中留下了一段重要的代碼。更正。


查看完整回答
反對 回復 2021-11-28
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

在上述 AuthorizationHandler 中,我需要訪問一些傳遞給控制器的東西,例如路由中的 ID 或 DTO

請不要那樣做。您基本上是在復制有關如何從請求中解析參數(shù)的現(xiàn)有邏輯。

基本處理程序用于基本情況:例如,只有“BookClub”角色的經過身份驗證的成員才能訪問這些BooksController方法。那太棒了。

一旦您發(fā)現(xiàn)自己需要來自消息本身的信息,請不要手動進行所有解析。讓 ASP 做它的事情并根據(jù)您給定的約束解析消息,然后當消息完成時,在您獲得的對象上調用您的授權邏輯。


查看完整回答
反對 回復 2021-11-28
  • 2 回答
  • 0 關注
  • 381 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號