美好的一天!
我正在开发一个ASP.NET Web API 2项目.在某一点上,需要上传一些文件.这些文件需要链接到某个FileModel(我们自己的类).因此,客户端需要将IEnumerable作为参数发送,将文件作为内容发送.因为它是一个RESTful API,所以必须在同一个请求中发送.
我们能想到的最好的是跟随Controller的行动:
public async Task<HttpResponseMessage> Add([FromUri] IEnumerable<FileModel> fileModels)
{
// REQUEST INTEGRITY TESTING
var streamProvider = new CustomMultipartFormDataStreamProvider(fileSavePath, fileModels);
// Read the MIME multipart content using the stream provider we just created.
var work = await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(async t =>
{
// SOME WORK DONE AFTER SAVING THE FILES TO THE HARD DRIVE
}
}
Run Code Online (Sandbox Code Playgroud)
问题如下:文件正在使用'multipart/form-data'Content-Type标头上传.在操作服务器端的文件之前,我们需要知道FileModels的内容.如果我们使用MultipartFormDataStreamProvider,我们只能在文件已保存到硬盘驱动器后访问非文件参数.
我们可以找到的唯一解决方法是在URL中发送IEnumerable <FileModel>参数.但鉴于URL的最大长度有限,这不是一种可靠的方法.
问题是:有没有办法提交IEnumerable <FileModel> fileModels参数和请求正文中的文件,并在访问文件之前访问fileModels参数?我们还希望能够使用HttpContext.Current.Request.Files.Count;
我们当前用于文件上传的jQuery看起来像这样(为了早期测试目的,它只支持一个文件上传):
$('#Upload').click(function(e) {
e.preventDefault();
var headers = new Array(); …Run Code Online (Sandbox Code Playgroud) 美好的一天!
我目前通过以下代码使用Newtonsoft Json Serializer:
private string serializeAndIgnoreEmail(UserMembership obj)
{
var json = JsonConvert.SerializeObject(obj, Formatting.Indented,
new JsonSerializerSettings() { ContractResolver = new DocumentIdContractResolver() });
return json;
}
private class DocumentIdContractResolver : CamelCasePropertyNamesContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
return base.GetSerializableMembers(objectType).Where(o => o.Name != "Email").ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
每次我需要序列化一个对象时,我都会调用'serializeAndIgnoreEmail'方法.我现在想用它的加密版本替换每个属性的内容,我不知道在哪里这样做.
我的猜测是覆盖'DocumentIdContractResolver'中的一个方法,但是有很多CreateBlahBlahBlah,我觉得很难使用它们.
这是正确的方法,继续修改ContractResolver还是我应该尝试别的?
谢谢!