将 ASP.NET MVC HttpContext 发送到 Web Api HttpContext

2023-12-02

我正在尝试上传文件,并且想将当前的 MVC HttpContext.Current.Request.Files 传递给 Web API。

我试图通过HttpFileCollectionBase作为参数将其传递给 API,但它始终为 null。控制器

public object UploadAttachment(string param1, int param2, HttpFileCollectionBase files)
{
   string _url = _restUrl + param1+ "/Folders/" + param2+ "/UploadAttachment";
   HttpResponseMessage _response = SendJsonRequest(_url, HttpMethod.Post, files);
   var ret = DeserializeResponse(_response);
   return ret;
}

API code:

[HttpPost]
[Route("Archives/{param1}/Folders/{param2}/UploadAttachment")]      
public IHttpActionResult UploadAttachment([FromUri]string param1, [FromUri]int param2, [FromBody] HttpFileCollectionBase files)

查看代码

using (Ajax.BeginForm("UploadAttachment", null, new { param1 = Model.Param1 }, new AjaxOptions { HttpMethod = "POST", OnSuccess = "uploadAttachmentSuccess" }, new { id = "uploadAttachment", enctype = "multipart/form-data" }))
                    {
                    <div class="row">
                        <div class="col-xs-10">
                            <div class="input-group">
                                <label class="input-group-btn" title="">
                                    <span class="btn btn-primary">
                                        <input type="file" name="file_upload" id="file_upload" style="display: none;" multiple />
                                        Browse
                                    </span>
                                </label>
                                <input type="text" id="file_upload_name" class="form-control" readonly>
                            </div>
                        </div>
                        <div class="col-xs-2">
                            <button type="submit" class="btn btn-success" data-toggle="tooltip" id="btn-submit-upload" title="" disabled>
                                Upload
                            </button>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-xs-12" id="warning-format">
                        </div>
                    </div>
                    }

SendJsonRequest 实现

            protected virtual HttpResponseMessage SendJsonRequest(string url, HttpMethod method, object objectToSerialize = null, bool tryToRefreshToken = true)
    {
        ...
        HttpRequestMessage _request = new HttpRequestMessage(method, _uri);
        if (objectToSerialize != null)
        {
            string _serializedJSONObject = JsonConvert.SerializeObject(objectToSerialize);
            _request.Content = new StringContent(_serializedJSONObject);
            _request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        }...

我创建了一个示例,用于将文件从 MVC 控制器上传到 Web Api 控制器,并且它运行良好

MVC控制器:

    [ActionName("FileUpload")]
    [HttpPost]
    public ActionResult FileUpload_Post()
    {
        if (Request.Files.Count > 0)
        {
            var file = Request.Files[0];

            using (HttpClient client = new HttpClient())
            {
                using (var content = new MultipartFormDataContent())
                {
                    byte[] fileBytes = new byte[file.InputStream.Length + 1];                     file.InputStream.Read(fileBytes, 0, fileBytes.Length);
                    var fileContent = new ByteArrayContent(fileBytes);
                    fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = file.FileName };
                    content.Add(fileContent);
                    var result = client.PostAsync(requestUri, content).Result;
                    if (result.StatusCode == System.Net.HttpStatusCode.Created)
                    {
                        ViewBag.Message= "Created";
                    }
                    else
                    {
                        ViewBag.Message= "Failed";
                    }
                }
            }
        }
        return View();
    }

Web API 控制器:

    [HttpPost]
    public HttpResponseMessage Upload()
    {
        if(!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        if (System.Web.HttpContext.Current.Request.Files.Count > 0)
        {
            var file = System.Web.HttpContext.Current.Request.Files[0];
            ....
            // save the file
            ....
            return new HttpResponseMessage(HttpStatusCode.Created);
        }
        else
        {
            return new HttpResponseMessage(HttpStatusCode.BadRequest);
        }
    }

有关在 Web Api 中保存文件的更多信息,请参阅Web API:文件上传

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ASP.NET MVC HttpContext 发送到 Web Api HttpContext 的相关文章

随机推荐

  • 如何在没有 libcurl 的情况下用 C 发出 HTTP get 请求?

    我想编写一个 C 程序来生成 Get 请求 而不使用任何外部库 仅使用 C 库和套接字是否可以实现这一点 我正在考虑制作一个 http 数据包 使用正确的格式 并将其发送到服务器 这是唯一可能的方法还是有更好的方法 使用 BSD 套接字 或
  • 主要 Xcode 7 Sprite Kit Atlas 错误

    所以今天我决定开始在 El Capitan 和 iOS 9 上测试我的游戏 这是一个大项目 我已经用业余时间从事了近 2 年的工作 所以我将代码移植到 Swift 2 0 单击运行按钮并祈祷 Apple 没有破坏 Sprite Kit 就像
  • 如何使用 Volley 在 Android 中发送“multipart/form-data”POST

    有谁能够完成发送multipart form data在 Android 中使用 Volley 进行 POST 了吗 我尝试上传没有成功image png使用 POST 请求到我们的服务器 我很好奇是否有人这样做 我相信执行此操作的默认方法
  • Web 浏览器控件的进度条

    如何使用 C 语言在 Windows 应用程序项目中放置和使用 Web 浏览器控件的进度条 看着那 这WebBrowser ProgressChanged event
  • 了解 Java 迭代器

    如果我运行以下代码 它将打印出 3 次重复内容 但是当我删除 while 循环内的 if 语句时 只是为了看看它会迭代多少次 它会启动一个无限循环 这实际上如何hasNext 方法有效吗 我认为这只会迭代 5 次 因为列表中有 5 个项目
  • 使用鼠标和触摸通过 Adorner 进行 WPF 拖放

    我希望这是一个好问题 所以我将详细写下我想要实现的目标 我在互联网上找到的内容 并展示我到目前为止所做的事情以及我尝试过的事情 我需要向我的应用程序添加拖放功能 我有图像 基本上是控件 我想将其拖动到列表框的项目 这是示例用户界面 这是我现
  • 我们如何使用 train_on_batch 执行提前停止?

    我在循环中手动运行纪元 并在循环中进一步嵌套小批量 在每个小批量中 我需要调用train on batch 启用定制模型的训练 是否有手动方法来恢复提前停止的功能 即打破循环 在实践中 提前停止 主要是通过以下方式完成的 1 训练 X ep
  • 扩展 BaseRequestOptions 时注入的依赖项未定义

    我正在延长BaseRequestOptions在 Angular2 中为每个请求添加标头 我也有一个Config提供基于域的键 值对的类 我需要将其注入到我的派生类中 import BaseRequestOptions from angul
  • C# - 异步返回值

    private TaskCompletionSource
  • Xdebug 异常类的方法

    是否可以看到 Xdebug 创建的扩展 Exception 类的方法 我想获取 HTML 格式的堆栈跟踪 因此 在破解之后 没有像 Niels 展示的那样的方法 但有一个名为 exception gt xdebug message 的公共属
  • 添加谷歌服务 - 任务“:app:processDebugResources”执行失败

    我正在尝试按照此网站上的步骤在 Android Studio 中实现 GCM 客户端 在 Android 上实现 GCM 客户端 正如 设置 Google Play 服务 中提到的 我编辑了应用程序的 build gradle 文件 使其看
  • ThreeJS 中的弯曲文本对象

    有this回购协议this例如 它已经有近 2 年历史了 因此不适用于 ThreeJS 的最新版本 我遇到以下错误和警告 error THREE Matrix3 getInverse no longer takes a Matrix4 ar
  • Python - 打印列表中既没有逗号也没有撇号的项目

    我的代码的最小工作示例 Create output data file out data file open output file w out data file write Header n out data file close li
  • 恰好具有 k 个颜色边的生成树

    我有一个连通的无向图 其边为黑色或白色 并且有一个整数 k 我正在尝试编写一个算法来判断是否存在具有正好 k 个黑边的生成树 不一定必须找到实际的树 我使用克鲁斯卡尔算法来查找生成树中黑边的最小和最大可能数量 如果 k 超出此范围 则不存在
  • 手动触发IOptionsMonitor<>.OnChange

    在 ASP NET Core 2 1 中 我使用 IOptionsMonitor 并对其进行设置 以便我可以在更改 appSettings json 文件时成功获取事件 所以这是有效的 我现在想做的是通过代码手动更改选项中的一些值 并触发我
  • 带有数据流的 Apache Beam Go SDK

    我一直在使用 Go Beam SDK v2 13 0 但无法获取字数统计示例致力于 GCP 数据流 它进入崩溃循环尝试启动org apache beam runners dataflow worker DataflowRunnerHarne
  • C++:typeid 忽略低级 const 引用,但不忽略指针

    考虑以下代码 int main const int i 42 auto p i p is const int const is low level const auto q i q is const int reference to con
  • 计算三角形第三个点的坐标

    好吧 我知道这听起来应该在 math stackoverflow com 上问 但这是我在高中时忘记的令人尴尬的简单数学 而不是高级研究生的东西 我正在做一些图形编程 我有一个三角形 顺便说一句 这个三角形的两条边相等 但我不确定这是否相关
  • Oracle SQLPLUS - 当假脱机超过 50,000 条记录时,如何仅输出一次标头?

    我正在将一个大结果假脱机到磁盘 并且只想包含一次标头 我只需要一次标题 而不是每 50 000 条记录 根据文档 在第二次打印标题之前 我似乎限制为 50 000 条记录 根据文档 50 000 是最高值 我尝试将页面大小设置为零并打开标题
  • 将 ASP.NET MVC HttpContext 发送到 Web Api HttpContext

    我正在尝试上传文件 并且想将当前的 MVC HttpContext Current Request Files 传递给 Web API 我试图通过HttpFileCollectionBase作为参数将其传递给 API 但它始终为 null