【问题标题】:HttpContext.Current.Request.Files is always emptyHttpContext.Current.Request.Files 始终为空
【发布时间】:2016-08-31 20:31:27
【问题描述】:

我看到很多 WebAPI 接受文件的示例。但是,我还没有找到一个解决方案,为什么不管我尝试了什么,让我的 HttpContext.Current.Request.Files 有一个我通过 Postman 发布到 Web API 的文件。 (我也通过控制台应用程序发布了该图像并得到了相同的结果)

[HttpPost]
[ActionName("Post")]
[ResponseType(typeof(PeliquinApiRsp))]
    public IHttpActionResult Post(int personId)
    {
        var empPicture = PeliquinIOC.Resolve<IEmpPictureBL>(UserId, UserName, PropertyCode);

        if (!(IsAllowed(SysPrivConstants.SYSPRIV__TYPE_PERSONNEL, SysPrivConstants.SYSPRIV__FUNC_PERSONNEL_CARDHOLDER, SysPrivConstants.SYSPRIV__LEVEL_FULL)))
            return (Unauthorized());

        var apiRsp = new PeliquinApiRsp();

        var httpRequest = HttpContext.Current.Request;

        if (httpRequest.Files.Count == 0)
        return BadRequest();

        empPicture.Post(httpRequest.Files[0].InputStream, personId);

        apiRsp.SetStatus();
        apiRsp.SetData("EmpPicture");

        return (Ok(apiRsp));
    }

这是一个非常简单的方法。我一直在使用 Postman 发布二进制 .jpg 文件。我已经设置了 content-type = "multipart/form-data"。除了 .Files = 0 之外,我的代码中没有任何错误。

我在我的 WebApiConfig 中为 API 的其余部分提供了一些额外的设置,但为了以防万一,我会将它们与此特定方法的路由一起包括在内:

config.Formatters.Remove( config.Formatters.XmlFormatter );
config.Formatters.JsonFormatter.SupportedMediaTypes.Add( new MediaTypeHeaderValue( "application/json" ) );
config.Formatters.FormUrlEncodedFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));


config.Routes.MapHttpRoute(
            name: "EmpPicturePost",
            routeTemplate: "api/EmpPicture/{personId}",
            defaults: new { controller = "EmpPicture", action = "Post" },                
            constraints: new { personId = @"^\d+$", httpMethod = new HttpMethodConstraint(HttpMethod.Post, HttpMethod.Options) }
        );

我无计可施,试图弄清楚为什么这么简单的事情却行不通。我已经尝试了很多其他方法,它们都更像 MVC,但这不是 MVC 应用程序,它们会抛出不同的错误。感谢您的帮助。

【问题讨论】:

  • 您是使用form-data 单选按钮还是仅设置content-type 标头?
  • 我正在使用二进制单选按钮,并在我的本地驱动器上选择一个 .jpg 文件。我也在设置内容类型标题。
  • 我还创建了一个全新的 Web API 并使用内置的默认 ValuesController 并尝试向其发布图像,并导致了同样的问题。

标签: c# asp.net postman httpcontext


【解决方案1】:

我也为这个问题苦苦挣扎了一段时间,但最终找到了解决方案。就我而言,我是从 iOS 应用程序调用端点,并且文件始终为空。我发现我需要有一个与表单中的文件字段名称匹配的 http 标头,因此请求必须有一个 http 标头,例如:

file: newImage.jpg

在请求的正文中,您需要类似

的内容
Content-Disposition: form-data; name="file"; filename="newImage.jpg"
Content-Type: image/jpg

请注意,这不是一个有效的请求,只是一个 sn-p。您仍然需要更多的 http 标头和正文中字段周围的边界。我的观点是,似乎要求是 http 标头键和表单字段名称匹配并且都存在。

【讨论】:

  • 这是我在 Postman 中的问题。我正在选择一个文件,然后将文件名从 Value 文本框复制/粘贴到 Key 文本框,它正在插入一个新行,这意味着文件名与文件的实际名称不匹配。
【解决方案2】:

我怀疑你的问题的根本原因很可能是因为你在帖子中提到的 -

我一直在使用 Postman 发布二进制 .jpg 文件。我已经设置 content-type = "multipart/form-data"

您不应该在邮递员工具中明确这样做。 Postman 工具足够智能,可以自行自动检测Content-Type。请参阅我的this 回答,以帮助您获得更多帮助。

Content-Type 设置为“multipart/form-data”涉及到多个部分边界的复杂概念,详见here。邮递员工具会自动为您完成设置边界的繁重工作,这就是为什么它不希望您在这种情况下明确设置content-type

【讨论】:

    【解决方案3】:

    我认为 Postman 无法填充 HttpContext.Current.Request.Files 收藏。我们使用以下方法解决了这个问题: 等待 Request.Content.ReadAsByteArrayAsync().ConfigureAwait(false);

    伊沃

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 2019-07-18
      • 2019-08-18
      • 2011-12-29
      • 2019-07-02
      • 2019-05-04
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多