【问题标题】:Customizing Web API Controller Parameters自定义 Web API 控制器参数
【发布时间】: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 路由?我需要制作自定义路线吗?如果是这样,那会是什么样子?提前致谢。

【问题讨论】:

    标签: rest post model-view-controller asp.net-web-api http-status-code-405


    【解决方案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]不能在同一个路由签名中使用两次。
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2016-09-07
    相关资源
    最近更新 更多