使用未在 swagger 中公开的 HTTP 内容上传 API 文件

2024-01-28

我正在将 swagger 接口实现到现有的 Web API 中。当前的 API 控制器公开了一个异步上传函数,该函数使用Request.Content异步传输图像。已使用的代码在中进行了解释this http://www.c-sharpcorner.com/article/upload-and-save-multipartform-data-in-webapi-2/文章。

我的 API 控制器:

    [HttpPost]
    [Route("foo/bar/upload")]
    public async Task<HttpResponseMessage> Upload()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        var provider = await Request.Content.ReadAsMultipartAsync(new InMemoryMultipartFormDataStreamProvider());
        NameValueCollection formData = provider.FormData;
        HttpResponseMessage response;
        //access files  
        IList<HttpContent> files = provider.Files;
        if (files.Count > 0)
        {
            HttpContent file1 = files[0];
            using (Stream input = await file1.ReadAsStreamAsync())
            {
                object responseObj = ExternalProcessInputStream(input)
                response = Request.CreateResponse(HttpStatusCode.OK, responseObj);
            }
        }
        else 
        {
            response = Request.CreateResponse(HttpStatusCode.BadRequest);
        }
        return response;
    }

这很有效,但是当我通过 swagger 公开它时,我有一个无参数函数,它在使用时返回错误。

我的问题是如何提供适当的值来测试此方法?


您需要添加自定义 IOperationFilter 来处理此问题。

假设你有一个像这样的控制器:

    [ValidateMimeMultipartContentFilter]
    [HttpPost, Route("softwarepackage")]
    public Task<SoftwarePackageModel> UploadSingleFile()
    {

        var streamProvider = new MultipartFormDataStreamProvider(ServerUploadFolder);
        var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<SoftwarePackageModel>(t =>
        {
            var firstFile = streamProvider.FileData.FirstOrDefault();

            if (firstFile != null)
            {
                // Do something with firstFile.LocalFileName
            }

            return new SoftwarePackageModel
            {

            };
        });

        return task;
    }

然后,您需要创建一个 Swashbuckle.Swagger.IOperationFilter 来将文件上传参数添加到您的函数中,例如:

    public class FileOperationFilter : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.operationId.ToLower() == "softwarepackage_uploadsinglefile")
            {
                if (operation.parameters == null)
                    operation.parameters = new List<Parameter>(1);
                else
                    operation.parameters.Clear();
                operation.parameters.Add(new Parameter
                {
                    name = "File",
                    @in = "formData",
                    description = "Upload software package",
                    required = true,
                    type = "file"
                });
                operation.consumes.Add("application/form-data");
            }
        }
    }

在您的 Swagger 配置中,您需要注册过滤器:

config.EnableSwagger(c => {... c.OperationFilter<FileOperationFilter>(); ... });

最重要的是,我还添加了 FilterAttribute 来过滤 Multipart 内容:

public class ValidateMimeMultipartContentFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {

    }

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

使用未在 swagger 中公开的 HTTP 内容上传 API 文件 的相关文章

  • 我们可以在 C# 中定义枚举的隐式转换吗?

    是否可以在 C 中定义枚举的隐式转换 可以实现这一目标的东西吗 public enum MyEnum one 1 two 2 MyEnum number MyEnum one long i number 如果没有 为什么不呢 有一个解决方案
  • MVC。网络错误:初始化字符串的格式不符合从索引 0 开始的规范

    我的连接字符串是
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 带方括号的 Uri.EscapeUriString

    这是一个奇怪的问题 但让我们看看它会得到什么样的回应 如果我编写一个控制台应用程序 VS 2013 NET 4 5 1 并执行这行代码 Uri EscapeUriString 我明白了 但是 如果我执行同样的事情 嗯 从技术上来说Uri E
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 在宏中使用 # [重复]

    这个问题在这里已经有答案了 请解释一下代码 include
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与

随机推荐

  • Android 操作栏两行文本标签

    有没有一种方法 也许是不间断空格线上的一些特殊字符 可以强制操作栏中的菜单项具有两个行标签 我认为这看起来比长的单行选项卡标签更好 Thanks R 编辑 附加信息 我很抱歉 到目前为止 我已经设法避免需要溢出菜单 可能是因为我正在为具有漂
  • 如何为文本冒险游戏实现调度表?

    我正在做一个C 中的文本冒险 http code google com p escape text rpg source browse Escape 有人建议我使用调度表 http en wikipedia org wiki Dispatc
  • SpriteKit 场景中出现意外的物理主体

    我正在使用 SpriteKit 实现一个质量弹簧系统 许多小型物理体与 SKPhysicsJointSpring 实例连接在一起 一些粒子在穿过场景中心时会被卡住 场景中央似乎有一个静止的小物体 我不知道它为什么在那里 这是一个简单的方法来
  • 如何在家设置 git lfs 服务器?

    我正在利用git lfs用于在 github 存储库中存储大文件 唯一的问题是有配额git lfs 具体来说 您每月只能存储 1 GB 并且只能流式传输 下载 1 GB 用完后 您必须支付 5 美元才能再获得 5 GB 这可能会变得昂贵 我
  • SVG 中的厚贝塞尔曲线,无伪影

    我尝试画粗一点贝塞尔线 http pomax github io bezierinfo 对于自定义桑基图 http bost ocks org mike sankey 我用SVG 路径 https developer mozilla org
  • 当 HTTPContext .Current 为 Nothing 时如何使用 Server.MapPath

    当我需要从网络服务器上的目录中删除一些图像文件时 我有一些代码可以正常工作 Dim ImageURL As String dsImages Tables 0 Rows iImgRow Item ImageURL Dim physicalNa
  • Visual Studio 中的“将所有警告视为错误,除了...”

    在 Visual Studio 中 我可以选择 将警告视为错误 选项 以防止在出现任何警告时编译我的代码 我们的团队使用此选项 但我们希望保留两个警告作为警告 有一个选项可以抑制警告 但我们确实希望它们显示为警告 所以这是行不通的 看来获得
  • 在 CNTLM 代理后面使用 pip

    我正在尝试在工作中使用代理后面的 pip 答案之一来自这个帖子 https stackoverflow com questions 9698557 how to use pip on windows behind an authentica
  • WPF 如何处理与 null 对象的属性的绑定?

    我有一个使用 itemTemplate 的 listBox 其中包含以下行
  • Access SQL 中的转义 '

    我正在尝试用 vba 进行域查找 如下所示 DLookup island villages village txtVillage 这工作正常 直到 txtVillage 类似于 Dillon s Bay 此时撇号被视为单引号 并且我收到运行
  • 将 gif 图像粘贴到 NSPasteboard 中

    我正在开发 osx 应用程序 我想粘贴一个Gif图像到粘贴板 我怎样才能做到这一点 我拥有的是 NSImage NSP纸板 我想做的是将图像粘贴到粘贴板中 我可以粘贴PNG图像 但我需要的是粘贴GIF image 我现有的代码 let im
  • Angular 客户端错误记录到服务器

    我想将客户端角度错误记录到服务器 所以我遵循this https stackoverflow com questions 43530156 angular 2 client side errors and this https stacko
  • 如何以编程方式触发 UIContextMenuInteraction 上下文菜单?

    我已将 UIButton 设置为 UINavigationController 内 UIViewController 中的 rightBarButtonItem 并将 iOS13 上下文菜单与其关联 长按按钮会按预期显示上下文菜单 有没有办
  • 内联样式无需引号即可工作

    例如 我有这把小提琴 http jsfiddle net qeBZk 您可以清楚地看到我缺少内联样式中的引号 但它仍然正确显示 据我所知 他们从来没有说过不使用引号是允许的 那么 是这样的 jsFiddle 中的一个错误 一个预期的功能 如
  • 开发中如何编辑Docker容器中的代码?

    我所有网站的代码都在下面 srv在我的容器中 我的 Dockerfile 使用 git 下载代码 并将其作为映像的一部分 以便更轻松地部署到生产环境 那么在开发中如何编辑代码呢 我认为使用卷是解决方案 例如 v docker myconta
  • 活动“死亡”时服务崩溃

    我有一个启动服务的活动 在我的活动中 startService new Intent this MyService class 在我的服务中 onStart Show notification int icon R drawable ico
  • 在 Vaadin 中获取组件的准确宽度和高度

    在vaadin中 如果我将宽度和高度设置为未定义 那么在使用getHeight getWidth 函数时我将得到 1 如果我使用 sizeful 我会得到 100 但是如何获得组件的准确宽度和高度呢 您可以通过调用 javascript 函
  • jquery:如何找到当前元素之前2个元素的元素

    我有一个如下所示的标记 h3 Paragraf3 dummytext h3 p a Quisque id odio Praesent venenatis metus at tortor pulvinar varius Lorem ipsum
  • Laravel Sail 数据库和用户未创建

    我刚刚使用 laravel sail 设置了一个 laravel 项目 由于某种原因 在构建过程中它没有创建给定的数据库和用户 我很困惑为什么 因为我觉得我已经配置了所有正确的东西 执行时 vendor bin sail artisan m
  • 使用未在 swagger 中公开的 HTTP 内容上传 API 文件

    我正在将 swagger 接口实现到现有的 Web API 中 当前的 API 控制器公开了一个异步上传函数 该函数使用Request Content异步传输图像 已使用的代码在中进行了解释this http www c sharpcorn