ASP .NET WebAPI 路由数据架构

Posted

技术标签:

【中文标题】ASP .NET WebAPI 路由数据架构【英文标题】:ASP .NET WebAPI Route Data Schema 【发布时间】:2016-02-05 05:21:15 【问题描述】:

目前,我们正在使用这样的路线:

[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(dynamic uploadedData)

    JArray files = uploadedData.pdfs;
    // ...

我不想使用dynamic,而是希望对传入的数据有一个大致的了解。所以我可以使用这样的设置,并使用一个定义架构的类:

public class UploadRequest : JObject

    public JArray pdfs  get; set; 


[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(UploadRequest uploadedData)

    // Now can access the JArray via uploadedData.pdfs directly
    // ...

这是解决这种情况的正确方法吗?或者是否有另一种通过 ASP .NET WebAPI 接收 JSON 数据的标准最佳实践?

具体来说,这种方法目前不起作用。虽然我的小型架构类扩展了 JObject,但我得到了一个错误

参数字典包含“EditPdfServer.Controllers.PdfFileController”中方法“System.Threading.Tasks.Task`1[System.Object] Upload(UploadRequest)”的参数“uploadedData”的无效条目。字典包含“Newtonsoft.Json.Linq.JObject”类型的值,但参数需要“EditPdfServer.Controllers.PdfFileController+UploadRequest”类型的值。

首先,这似乎是一种合适的方法吗?其次,有没有更好的?第三,为什么这种方法不起作用?提前致谢。

【问题讨论】:

你试过把uploadData的名字改成pdfs 这个链接可能对你有帮助weblog.west-wind.com/posts/2012/Aug/30/… 【参考方案1】:

你走上正轨了。

您无需过分关注 Newtonsoft.Json 的内部实现。特别是,你应该尽量避免使用 JObject/JToken/其他 J-types,你绝对不需要继承 JObject。

您的请求对象类可以是:

public class UploadRequest

    [JSONProperty("pdfs")]
    public SomePDFClass PDFs[]  get; set; 

这将映射到以下请求:


    "pdfs": [
         <some PDF object here> ,
         <some PDF object here> ,
         <some PDF object here> 
    ]

JSONPropertyAttribute 的字符串参数定义了属性在 JSON 文档中出现的名称,因此您不需要在代码中使用与在 JSON 中相同的名称。您可以在代码中更改名称,只要该属性仍使用与文档相同的名称即可。

【讨论】:

【参考方案2】:

我建议为您的 pdfs 属性使用 JSONproperty 属性:

public class UploadRequest : JObject

   [JSONProperty("<name of the property in the JSON object>")]
   public JArray pdfs  get; set; 

还可以查看这篇文章以获取有关该属性的更多信息:JSON.NET deserialize/serialize JsonProperty JsonObject

【讨论】:

【参考方案3】:

由于您的方法使用后置动词,您应该在方法参数上添加属性[FromBody]

[HttpPost]
public async Task<dynamic> Upload([FromBody] UploadRequest UploadedData)

    // Now can access the JArray via uploadedData.pdfs directly
    // ...

【讨论】:

值得一提的是,您只能以这种方式标记 1 个参数。如果您需要多个参数,请考虑创建一个包含所有参数的包装器对象。

以上是关于ASP .NET WebAPI 路由数据架构的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

Asp.net WebApi + EF 单元测试架构 DbContext一站到底

ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

ASP.NET WebAPI 中的路由冲突

asp.net webapi 2属性路由不起作用