小编ton*_*yes的帖子

如何将文件上传到Web API服务器并将参数发送到操作?

美好的一天!

我正在开发一个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)

c# jquery file-upload multipartform-data asp.net-web-api2

10
推荐指数
1
解决办法
2万
查看次数

Json .NET序列化 - 更改属性值

美好的一天!

我目前通过以下代码使用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还是我应该尝试别的?

谢谢!

c# json json.net

5
推荐指数
1
解决办法
1万
查看次数