C# 如何提供一个接受多部分表单数据或json内容的Web Api端点

C# 如何提供一个接受多部分表单数据或json内容的Web Api端点,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我正在构建一个Web Api,我希望为每个帖子提供一个端点,而不管客户端是发布多部分表单数据还是使用json内容发布帖子 编辑:代码可以处理多部分表单数据或json。我希望提供一个单一的url给客户点击,无论内容类型。不管怎样,给狗发帖都应该是给狗发帖 编辑2:唯一的问题是将dogDTO参数设置为null(dogDTO dog=null)。如果控制器方法签名如下所示,那么它可以正常工作 public async Task<IHttpActionResult> PostDog(DogD

我正在构建一个Web Api,我希望为每个帖子提供一个端点,而不管客户端是发布多部分表单数据还是使用json内容发布帖子

编辑:代码可以处理多部分表单数据或json。我希望提供一个单一的url给客户点击,无论内容类型。不管怎样,给狗发帖都应该是给狗发帖

编辑2:唯一的问题是将dogDTO参数设置为null(dogDTO dog=null)。如果控制器方法签名如下所示,那么它可以正常工作

public async Task<IHttpActionResult> PostDog(DogDTO dog)
我希望控制器方法如下所示:(假装错误处理和其他有用的东西):

[ResponseType(typeof(DogDTO))]
[HttpPost]
[路线(“api/狗”)]
公共异步任务PostDog(DogDTO-dog=null)
{
if(Request.Content.IsMimeMultipartContent())
{
//解析表单数据以构建dog
return wait PersistDogFormData();
}
//使用标准json内容
否则返回狗(狗);
}
使用上面的代码,我得到以下错误(在中提到,没有答案):

{“Message”:“出现错误”。,“ExceptionMessage”:“FormatterParameterBinding”不支持可选参数“dog”。,“ExceptionType”:“System.InvalidOperationException”,“StackTrace”:“at System.Web.Http.Controllers.HttpActionBinding.ExecuteBindingAsync(HttpActionContext actionContext,CancellationToken CancellationToken)\r\n位于System.Web.Http.Controllers.ActionFilterResult.d\u 2.MoveNext()\r\n---来自引发异常的上一个位置的堆栈结束跟踪----\r\n位于System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务任务)\r\n位于System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务任务任务任务任务)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()“}

是否有其他方法提供单一端点?我无法使用方法重载,因为我得到了不明确的路由运行时错误


非常感谢。

您应该使用自定义MediaTypeFormatter。更多信息请点击此处:

更新客户端代码,因为JSON序列化需要忽略该文件,因为它将位于单独的请求部分:

   public class Dog
    {
      public string Name {get;set}
      public string Breed {get;set}
      [JsonIgnore]
      public byte[] FileAboutDog {get;set}
    }
职位示例:

POST http://www.example.com/
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468


---------------------------acebdf13572468
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=dog

{"name":"DogName", "breed":"DogBreed"}

---------------------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg

image content
---------------------------acebdf13572468--
请求的Json部分必须命名为“dog”,服务器使用此名称查找Json部分。图像部分必须命名为“图像”。您可以通过检查内容类型而不是查找名称来删除此限制


我还没有测试代码,您可能需要进行一些调整。

您应该使用自定义MediaTypeFormatter。更多信息请点击此处:

更新客户端代码,因为JSON序列化需要忽略该文件,因为它将位于单独的请求部分:

   public class Dog
    {
      public string Name {get;set}
      public string Breed {get;set}
      [JsonIgnore]
      public byte[] FileAboutDog {get;set}
    }
职位示例:

POST http://www.example.com/
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468


---------------------------acebdf13572468
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=dog

{"name":"DogName", "breed":"DogBreed"}

---------------------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg

image content
---------------------------acebdf13572468--
请求的Json部分必须命名为“dog”,服务器使用此名称查找Json部分。图像部分必须命名为“图像”。您可以通过检查内容类型而不是查找名称来删除此限制


我还没有测试代码,您可能需要做一些调整。

也许我从您的帖子中漏掉了一些东西,但我能够读取多部分表单数据以及标准json。我想为客户提供一个url,以便他们可以以任何方式发布。您可以在ReadFromStreamAsync方法中构建对象。您将拥有一个端点,可以在其中发送json或多部分数据。在控制器中,只需检查dogDTO.FileAboutDog是否为null。如果(dogDTO.FileAboutDog!=null){//解析表单数据以构建dog return wait persistdogormdata();}//使用标准json内容,否则返回PersistDog(dog);}也许我错过了你文章中的一些内容,但我能够读取多部分表单数据以及标准json。我想为客户提供一个url,以便他们可以以任何方式发布。您可以在ReadFromStreamAsync方法中构建对象。您将拥有一个端点,可以在其中发送json或多部分数据。在控制器中,只需检查dogDTO.FileAboutDog是否为null。如果(dogDTO.FileAboutDog!=null){//解析表单数据以构建dog return wait persistdogormdata();}//使用标准json内容,否则返回PersistDog(dog);}
   public class Dog
    {
      public string Name {get;set}
      public string Breed {get;set}
      [JsonIgnore]
      public byte[] FileAboutDog {get;set}
    }
POST http://www.example.com/
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468


---------------------------acebdf13572468
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=dog

{"name":"DogName", "breed":"DogBreed"}

---------------------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg

image content
---------------------------acebdf13572468--