自定义Web API控制器参数

时间:2016-01-27 02:32:42

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

我们有一个从模型生成的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,我们希望制作一个新的PDF,并将其上传到AWS。为此,我们希望将其他参数传递给模型中不存在的路径。像这样:

// 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}

结果采用&#34; 405方法不允许&#34;和#34;正文中的消息;请求的资源不支持http方法&#39; POST&#39;&#34;。

如何将其他参数传递给POST路由?我需要制作自定义路线吗?如果是这样的话会是什么样子?提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

  • 告诉Web-Api通过将您的操作修改为

    来获取正文中的值

    public async Task<IHttpActionResult> PostPdf(Pdf pdf, [FromBody]double heightInches, [FromBody]double widthInches)

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

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