C# 如何设置WebAPI控制器以在单个POST请求中同时接受模型数据和文件?

C# 如何设置WebAPI控制器以在单个POST请求中同时接受模型数据和文件?,c#,http,model-view-controller,asp.net-web-api2,asp.net-apicontroller,C#,Http,Model View Controller,Asp.net Web Api2,Asp.net Apicontroller,我需要设置一个WebAPI控制器,以便在一篇文章中同时接受模型和文件。虽然我已经看到很多关于这个问题的堆栈溢出帖子,但我的却略有不同。为了更好地描述我的情况,我实际上是在尝试模仿MailGun API的行为。他们在RestSharp中提供了一个客户端示例,该示例发布了本质上是System.Net.Mail.MailMessage对象或模型以及附件文件。我已经编辑了WebApiConfig以接受以下行的多部分/表单数据:config.Formatters.JsonFormatter.Support

我需要设置一个WebAPI控制器,以便在一篇文章中同时接受模型和文件。虽然我已经看到很多关于这个问题的堆栈溢出帖子,但我的却略有不同。为了更好地描述我的情况,我实际上是在尝试模仿MailGun API的行为。他们在RestSharp中提供了一个客户端示例,该示例发布了本质上是System.Net.Mail.MailMessage对象或模型以及附件文件。我已经编辑了WebApiConfig以接受以下行的多部分/表单数据:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(新的MediaTypeHeaderValue(“多部分/表单数据”)

当我运行客户端应用程序时,我确实输入了Post方法(断点检查),但是消息m为null。是否有一种方法可以通过多部分/表单数据请求(类似于应用程序/json请求)自动将参数映射到消息模型?我可以手动解析请求头以获得我需要的所有信息,但这感觉很粗糙,而且不正确。我是否需要进行某种模型或参数绑定

这其中的另一个关键点是,我试图将摘要注释用作API帮助屏幕中的文档。我已经设置好了。为了避免混乱,我没有在这里添加总结评论。我想要一种将模型显示为必需的主体参数的方法,否则我只需要手动解析请求

以下是我到目前为止的基本情况:

[Route("api/{domain}/messages")]
[HttpPost]
public HttpResponseMessage Post(string domain, [FromBody]Message m)
{
  return Request.CreateResponse(HttpStatusCode.OK);
}
我的客户(基本上应该模仿邮枪的例子):

publicstaticirestresponse TestPostFileAndData()
{
RestClient=newrestclient();
client.BaseUrl=新Uri(“/api”);
RestRequest请求=新的RestRequest();
request.AddParameter(“域”,“参数类型.UrlSegment”);
request.Resource=“{domain}/messages”;
request.AddFile(“文件”,文件路径);
AddParameter(“from”,”);
AddParameter(“to”,”);
AddParameter(“to”,”);
请求。添加参数(“主题”、“主题行”);
请求.AddParameter(“文本”、“文本体”);
request.Method=Method.POST;
返回client.Execute(请求);
}
和我的消息模型:

public class Message
{
    public string from { get; set; } = "";
    public List<string> to { get; set; } = new List<string>();
    public string subject { get; set; } = "";
    public string text { get; set; } = "";
}
公共类消息
{
来自{get;set;}=“”;
public List to{get;set;}=new List();
公共字符串主题{get;set;}=”“;
公共字符串文本{get;set;}=”“;
}
public class Message
{
    public string from { get; set; } = "";
    public List<string> to { get; set; } = new List<string>();
    public string subject { get; set; } = "";
    public string text { get; set; } = "";
}