2

我们有一个从模型生成的Web API控制器。该模型具有这种形式:定制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} 

导致“405不允许的方法”,并在体内消息“所要求的资源不支持http方法'POST'“。

我该如何完成POST路由附加参数的传递?我是否需要制作自定义路线?如果是这样的话会是什么样子?提前致谢。

回答

0

您遇到的问题是由默认情况下Web-Api使用URL的查询字符串中的值绑定具有简单数据类型(例如double)的参数的事实造成的。所以,你有2种选择:

  • 泰尔的Web-API通过修改你的行动来获得从身体的值是

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

  • 传递的高度和宽度值在查询字符串而不是在体内。

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

+0

选择第二个选项,我怎么能访问那些在PostPdf方法? –

+0

与当前的方式完全相同,模型绑定将简单地将查询字符串中的值分配给操作方法的参数 –

+0

谢谢,但我无法使这两种方法都起作用。还有405个错误。对于第二个实例,我是否需要一些模型绑定指令来绑定查询字符串参数? –