我正在使用jQuery File Upload插件来调用 Web 服务并将图像上传到服务器。
图像上传正常,我已经向 Web 服务添加了一些验证,如果图像大于 4MB,则会引发异常。
这是我使用文件上传插件的方式:
var fileUploadInput = $('#uploader').fileupload({
dataType: 'json',
add: function (e, data) {
mainObject._addFile(e, data, mainObject);
},
done: function (e, data) {
mainObject._fileUploadDone(e, data, mainObject);
},
fail: function (e, data) {
mainObject._fileUploadFail(e, data, mainObject)
}
});
现在,当文件上传失败时,参数data
包含一个jqXHR
对象如下:
readyState: 4
status: 200
statusText: "success"
在 Chrome 中,jqXHR 包含由 Web 服务引发的异常生成的可爱错误消息。在 Fiddler 中,我可以看到响应是 400 Bad Response,并且可以在响应正文中看到错误消息。
有谁知道为什么这在 IE8 中没有被选中?
更新
我们的服务器端代码的简化版本:
[OperationContract(), WebInvoke(UriTemplate = "/Images", Method = "POST")]
public System.Guid CreateImage(System.IO.Stream Image)
{
//IE8 needs response to be in plain text format, or it will attempt to download the response :(
WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Type", "text/plain");
//perform validation
BLL.Errors validationErrors = BLL.Utilities.ImageFileProcessing.ValidateSizeAndFormat(multipartRequestParser.FileContents);
//if there were errors
if (validationErrors.Count > 0)
{
//send back the errors
throw new WebFaultException<BLL.Errors>(validationErrors, System.Net.HttpStatusCode.BadRequest);
}
//save the image (returns the identifier for the image)
System.Guid imageId = BLL.Custom.BeamUSBuyingWindow.DataTransferObjects.Brand.SaveImage(multipartRequestParser.FileContents);
//set the response status and URI for created resource
WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(new System.Uri(WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri + "/" + imageId.ToString()));
return imageId;
}
该方法ValidateSizeAndFormat
返回一个对象数组Errors
,其中包含我期望的错误文本。这是一个相当大的应用程序。
我对 Chrome 在 jqXHR 对象中发现 400 错误而 IE8 获得 200 成功感到有些困惑。尽管其他地方有类似的 Ajax 错误处理,但这个问题只发生在 File Upload 插件中。