c# - 如何修复 ASP.NET Web Api 从帖子接受的空 IFormFile

标签 c# asp.net-web-api http-headers form-data iformfile

最终,我希望使用尽可能基本的 jQuery 代码和服务器上的 C# 代码来创建一个简单的文件上传页面,但我一直在服务器上收到空的 IFormFile。

有很多示例说明如何使用带有表单数据的 Ajax POST 以及在 ASP.NET Web API Controller 操作上接收 IFormFile。 然而,似乎他们每个人都必须尝试对代码进行多次调整才能使其正常工作。

我制作了一个简单的解决方案,仅使用 API 部分并使用 Postman 向其发送文件。我尝试了 Content-Type 和 Accept header 的不同组合,但总是收到空文件。

为了满足一些托管要求,我使用 OWIN 自行托管应用程序。 这是 Controller 代码,我使用了默认值 Controller 并编辑了后操作...

    public string Post([FromBody]IFormFile file)
    {
        if (file != null)
        {
            return "Success: We got something!!!";
        }
        else
        {
           return "ERROR: We got nothing :-(";
        }

     }

我的 StartUp.cs 配置如下。虽然我的示例显示了 multipart/form-data,但我也尝试过 application/JSON 和其他格式,包括将其留空。

public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute("default", "{controller}");
            config.EnableCors();

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseWebApi(config);
        }

然后这是我最近的 postman 尝试的 2 个屏幕截图。我已经匆忙地将它们放在 Wix 服务器上,所以如果它们还不可见,我深表歉意

The Body

The Header

此时,我会很高兴 Post 方法收到文件的非空值。

最佳答案

使用 [FromForm] 属性而不是 [FromBody] 并删除 AcceptContent-Type header 。

编辑:

因此,看来我立即假设您正在使用 ASP.NET Core(尽管您另有指出),因为 IFormFileMicrosoft.AspNetCore.Http 命名空间类因此,这很自然地解释了为什么当您在 .NET Framework 上尝试此操作时它不起作用。

我认为从技术上讲,可以创建此 ASP.NET Core 接口(interface)的具体实现,然后创建一些特殊情况模型绑定(bind)器,但这肯定需要一些工作。

我不确定您在哪里找到了这些使 IFormFile 在 .NET Framework 中工作的示例,但是 I could'nt find any example.

我能找到的最接近 ASP.NET Core IFormFile 绑定(bind)的体验是这个 ApiMultipartFormFormatter ,它非常容易实现并且支持 HttpFile 绑定(bind)。一件不太明显的事情是,您需要将一些 HttpFile 属性包装到另一个类中才能使其工作。

public string Post([FromForm]MyViewModel vm)
{
    if (vm.file != null)
    {
        return "Success: We got something!!!";
    }
    else
    {
        return "Sadness: We got null :-(";
    }
}

public class MyViewModel
{
    public HttpFile SomeFile { get; set; }
}

关于c# - 如何修复 ASP.NET Web Api 从帖子接受的空 IFormFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57115005/

相关文章:

c# - 如果需要,将方案添加到 URL

c# - 检查 Type 实例是否为 C# 中的可空枚举

C# Tcp 通信线程池与异步调用

c# - 更新选择性字段时 EF5 无法处理并发

asp.net-web-api - 找不到与 ASP.NET Web API 中的请求 URI 错误匹配的 HTTP 资源

c# - 部署后 swagger-ui 返回 500

ajax - 使用 ajaxSetup beforeSend 进行基本身份验证会破坏 SignalR 连接

android - 如何使用 Koush ION 获取像 HttpStatusCode 这样的 HttpResponseMessage 的值

java - 如何在 RESTEasy 客户端框架中设置 HTTP header ?

azure - 如果客户端未发送,如何在 APIM 入站策略中获取/设置 Traceparent header ?