API文件上载(服务器端)在尝试读取之前检查是否存在实际文件

时间:2014-04-26 05:33:05

标签: c# c#-4.0 file-upload asp.net-web-api asp.net-web-api2

我创建了一个Web-API 2 Post方法,将物理文件上传到服务器。我注意到我仍然可以在不传递实际文件的情况下调用该API。

所以当服务器端运行这两行代码时

var sp = new MultipartFormDataStreamProvider(fileName);
await Request.Content.ReadAsMultipartAsync(sp);

当客户端(不是浏览器,而不是fiddler)调用API但没有上传文件时,我得到一个异常(被困)。

问题
有没有办法检查请求是否包含文件, BEFORE 调用Request.Content.ReasAsMultipartAsync ??

我的问题不是捕获异常,而是在我进入异常之前找到一个干净的学习方法,没有文件,以便我可以通知调用客户端。

2 个答案:

答案 0 :(得分:2)

首先,我建议将此语句包装在try catch中,如下所示:Sending HTML Form Data

// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
  throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}

string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);

try
{
  // Read the form data.
  await Request.Content.ReadAsMultipartAsync(provider);

  // TODO ... process files

  return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
  return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}

为什么要使用显式try catch?我们现在从来没有如何组装http请求(浏览器,Fiddler,第三方工具)......内容可能会被简单地损坏,无法处理标准方式。

Async内容读者的观点是,我们必须阅读内容,以获得答案

  

是否包含任何文件?

这就是Web API的设计方式。仅在需要时才阅读一次内容。在此之前......没有关于可用内容的信息。

例如,如果来自浏览器的请求来自<form>,请执行以下操作:

<form method="post" 
   enctype="multipart/form-data"
   action="/api/MyService/Upload">

 <input type="file" name="myFile"/>
 <button type="submit">submit</button>

</form>

那么即使以防万一,我们只提交(不选择任何文件)部分请求正文将是:

-----------------------------7de411d9099c
Content-Disposition: form-data; name="myFile"; filename=""
Content-Type: application/octet-stream


-----------------------------7de411d9099c--

因此,在我们阅读之前,我们不知道是否有任何文件

答案 1 :(得分:1)

同意@Radim的回应。

您可以采取的另一种方法(仅当您在IIS中托管服务时,默认模板才会这样做)

HttpResponseMessage result = null;
var httpRequest = HttpContext.Current.Request;

// Check if files are available
if (httpRequest.Files.Count > 0)
{

请注意,您在这里依赖于System.Web,但是如果您使用的是IIS而不是自托管,那么这很好。