我创建了一个Web-API 2 Post方法,将物理文件上传到服务器。我注意到我仍然可以在不传递实际文件的情况下调用该API。
所以当服务器端运行这两行代码时
var sp = new MultipartFormDataStreamProvider(fileName);
await Request.Content.ReadAsMultipartAsync(sp);
当客户端(不是浏览器,而不是fiddler)调用API但没有上传文件时,我得到一个异常(被困)。
问题:
有没有办法检查请求是否包含文件, BEFORE 调用Request.Content.ReasAsMultipartAsync
??
我的问题不是捕获异常,而是在我进入异常之前找到一个干净的学习方法,没有文件,以便我可以通知调用客户端。
答案 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而不是自托管,那么这很好。