自定义 Web API 控制器参数

Posted

技术标签:

【中文标题】自定义 Web API 控制器参数【英文标题】:Customizing Web API Controller Parameters 【发布时间】:2016-05-03 20:10:29 【问题描述】:

我们有一个从模型生成的 Web API 控制器。该模型具有这种形式:

public class Pdf

    public int ID  get; set; 
    public string Name  get; set; 
    public string Url  get; set;  // File stored in AWS
    public int Job_ID  get; set; 
    public List<PdfPage>  get; set; 

自动生成的控制器有这个默认的 POST 路由:

// POST: api/Pdfs
[ResponseType(typeof(Pdf))]
public async Task<IHttpActionResult> PostPdf(Pdf pdf)

    if (!ModelState.IsValid)
    
        return BadRequest(ModelState);
    

    db.JobFiles.Add(pdf);
    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new  id = pdf.ID , pdf);

然而,在创建新的Pdf 时,文件本身被放入 AWS。在到达这条路线的情况下,我们正在制作一个新的Pdf,我们想要制作一个将上传到 AWS 的新 PDF。为了做到这一点,我们想要将额外的参数传递给模型中不存在的路由。像这样的:

// POST: api/Pdfs
[ResponseType(typeof(Pdf))]
public async Task<IHttpActionResult> PostPdf(Pdf pdf, double heightInches, double widthInches)

    if (!ModelState.IsValid)
    
        return BadRequest(ModelState);
    

    // Make a blank PDF based on the dimensions provided
    MemoryStream newBlankPdfMemoryStream = PdfOperations.ITextSharpNewBlankPdf(8.5, 11);
    pdf.Url = await AWS.S3PubliclyAccessibleInsert("paragonpdfimages", pdf.Job_ID + "/" + pdf.Name, newBlankPdfMemoryStream);

    db.JobFiles.Add(pdf);
    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new  id = pdf.ID , pdf);

但是,将此正文传递给 POST 路由:

pdf: Job_Id: 395, Name: "fds", widthInches: 8.5, heightInches: 11

导致“405 Method Not Allowed”和“请求的资源不支持 http 方法'POST'”正文中的消息。

如何将附加参数传递给 POST 路由?我需要制作自定义路线吗?如果是这样,那会是什么样子?提前致谢。

【问题讨论】:

【参考方案1】:

您遇到的问题是由于默认情况下 Web-Api 使用 URL 查询字符串中的值将参数与简单数据类型(例如双精度)绑定。所以你有两个选择:

告诉 Web-Api 通过将您的操作修改为从正文中获取值

public async Task&lt;IHttpActionResult&gt; PostPdf(Pdf pdf, [FromBody]double heightInches, [FromBody]double widthInches)

在查询字符串中传递高度和宽度值,而不是在正文中。

....../PostPdf?heightInches=11&amp;widthInches=8.5

【讨论】:

使用第二个选项,如何访问 PostPdf 方法中的那些? 与您当前的方式完全相同,模型绑定将简单地将查询字符串中的值分配给操作方法的参数 谢谢,但我无法让其中任何一个工作。仍然是 405 错误。对于第二个实例,我是否需要一些模型绑定指令来绑定查询字符串参数? 还有,根据这个documentation,[FromBody]不能在同一个路由签名中使用两次。

以上是关于自定义 Web API 控制器参数的主要内容,如果未能解决你的问题,请参考以下文章

web api 自托管自定义 ioc 将数据注入控制器

ASP.NET Web Api 路由自定义

Web api dotnet core 中的 Api 版本控制错误的自定义错误响应

反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter

在自定义授权 MVC4 Web Api 中访问 post 或 get 参数

ASP.NET WEB API 中自定义对象的序列化 [重复]