时间:2019-03-17 标签:c#webrequestpostimagetowebapi

2023-12-01

我在将图像上传到我正在运行的 Web API 时遇到问题。使用 GET 请求时,我可以从 Web API 检索数据,但在处理 POST 请求时遇到问题。我需要将 BMP 图像上传到 Web API,然后发回 json 字符串。

[HttpPost]
public IHttpActionResult TestByte()
{
    Log("TestByte function entered");
    //test to see if i get anything, not sure how to do this
    byte[] data = Request.Content.ReadAsByteArrayAsync().Result;
    byte[] test = Convert.FromBase64String(payload);

    if(test == null || test.Length <= 0)
    {
        Log("No Payload");
        return NotFound();
    }

    if (data == null || data.Length <= 0)
    {
        Log("No payload");
        return NotFound();
    }

    Log("Payload received");
    return Ok();

}

发送图像的 MVC 端如下所示:

// Create a request using a URL that can receive a post. 
WebRequest request = WebRequest.Create(url);
// Set the Method property of the request to POST.
request.Method = "POST";

// Create POST data and convert it to a byte array.
byte[] byteArray = GetImageData(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, content, barcodeUri));
string base64String = Convert.ToBase64String(byteArray);
byte[] dataArray = Encoding.Default.GetBytes(base64String);

// Set the ContentType property of the WebRequest.
request.ContentType = "multipart/form-data";
// Set the ContentLength property of the WebRequest.
request.ContentLength = dataArray.Length;

// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(dataArray, 0, dataArray.Length);
// Close the Stream object.
dataStream.Close();

// Get the response.
WebResponse response = request.GetResponse();
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();

由于某种原因我总是得到 404WebException on

WebResponse response = request.GetResponse();

我已经检查过 URL 应该是正确的。是我格式化帖子 URL 的方式还是我犯了其他错误?

编辑,添加 webconfig 路由:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

你可以使用multipart/form-data来传输文件。以下是如何在 Web API 操作中读取上传文件内容的示例:

[HttpPost]
[Route("api/upload")]
public async Task<IHttpActionResult> Upload()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        return this.StatusCode(HttpStatusCode.UnsupportedMediaType);
    }

    var filesProvider = await Request.Content.ReadAsMultipartAsync();
    var fileContents = filesProvider.Contents.FirstOrDefault();
    if (fileContents == null)
    {
        return this.BadRequest("Missing file");
    }

    byte[] payload = await fileContents.ReadAsByteArrayAsync();
    // TODO: do something with the payload.
    // note that this method is reading the uploaded file in memory
    // which might not be optimal for large files. If you just want to
    // save the file to disk or stream it to another system over HTTP
    // you should work directly with the fileContents.ReadAsStreamAsync() stream

    return this.Ok(new
    {
        Result = "file uploaded successfully",
    });
}

现在使用以下命令编写客户端是一项简单的任务HttpClient:

class Program
{
    private static readonly HttpClient client = new HttpClient();

    static void Main()
    {
        string responsePayload = Upload().GetAwaiter().GetResult();
        Console.WriteLine(responsePayload);
    }

    private static async Task<string> Upload()
    {
        var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8180/api/upload");
        var content = new MultipartFormDataContent();

        byte[] byteArray = ... get your image payload from somewhere
        content.Add(new ByteArrayContent(byteArray), "file", "file.jpg");
        request.Content = content;

        var response = await client.SendAsync(request);
        response.EnsureSuccessStatusCode();

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

时间:2019-03-17 标签:c#webrequestpostimagetowebapi 的相关文章

  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 找不到 HttpContextBase 命名空间

    public string GetCartId HttpContextBase context if context Session CartSessionKey null if string IsNullOrWhiteSpace cont
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • 加载配置文件时发生错误:访问路径 c:\Program Files (x86)\... 被拒绝

    我有一个在 Windows 7 上使用 Visual Studio 2010 中的安装程序部署的应用程序 该程序在 Windows 7 和 XP 上部署并运行良好 但当我在 Windows 8 系统上部署它时 出现有关访问配置文件的错误 该
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba
  • 使用 unrar 库 - 将文件提取到文件流缓冲区中

    我需要的是能够将 rar 文件中的文件提取到流中 我正在创建一个测试用例来了解如何使用解压源文件 http www rarlab com rar unrarsrc 3 9 9 tar gz 我已经搜索和修补了一段时间 但我不知道如何使用该库
  • 如何将此 Boost ASIO 示例应用到我的应用程序中

    我已经阅读了很多 ASIO 示例 但我仍然对如何在我的应用程序中使用它们感到困惑 基本上 我的服务器端需要接受超过100个连接 客户端 这部分是通过使用线程池 通常每个CPU核心2 4个线程 来完成的 为简单起见 我们假设只有一个连接 为了
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • 如何将敏感数据从视图传递到控制器

    为了构造一个包含大量信息的实体 我需要执行一系列表单提交 每次我从控制器返回视图时 我都需要传递一些有关尚未建立的实体的 id 现在 我将这些信息注入隐藏字段 并在发回服务器时继续构建实体 这样的场景持续了好几次 我对这种传递敏感信息的方式
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • PHP 5.4.17 替代“... 运算符”

    我想知道是否有人知道 PHP 5 6 x 及更高版本的替代方案 运算符 或 splat 运算符 我相信它被称为 我目前在 PHP 7 版本中所做的是 this gt callAction explode this gt routes aut
  • 工厂创建相同接口的不同对象

    我有1个接口 public interface ISummary int EventId get set 还有许多实现该接口的具体类 public class EmployeeSummary ISummary public int Even
  • 为什么 TRUE == "TRUE" 在 R 中是 TRUE?

    Why TRUE TRUE is TRUE in R 有没有等价的 in R Update 这些都在回归FALSE TRUE True TRUE true TRUE T 唯一的TRUE值为TRUE TRUE 如果检查identical 一切
  • 对于程序的不同运行,全局变量的地址是否相同?

    考虑以下代码片段 int i 10 int main cout lt lt i 一旦为程序生成了 exe 程序不同运行的输出是否相同 假设操作系统支持虚拟内存 编辑 这个问题特定于存储在数据段中的全局变量 由于这是第一个全局变量 因此地址应
  • JS下载多个文件

    我的目标是有一个脚本来下载给定数组内的所有文件 var links http file examples com wp content uploads 2017 10 file example JPG 100kB jpg http file
  • 从 Android Activity 类调用 Javascript 函数

    我正在开发需要使用参数调用 Javascript 函数的应用程序 为了演示 我在这里写了我的 Activity 代码 我想从中调用 js 函数 主要活动 WebView wView FloatingActionButton fab Cont
  • 按键将对象分组为二维数组

    我有一系列对象 这些对象有一个属性称为time 如果这些对象的时间相同 我想将它们分组到同一个数组中 00 00 id 1 time 00 05 id 1 time 00 15 id 1 time 00 20 id 2 time 00 05
  • 批量复制特定文件到子文件夹中

    我有一个 Windows 批处理文件 正在运行该文件以将特定文件移动到子文件夹中 ECHO OFF ECHO Start Copy setlocal enabledelayedexpansion set SOURCE DIR C Users
  • 将数组插入 PHP 文件

    这可能非常愚蠢 但我们还无法做到这一点 我们正在尝试将数组插入到 php 文件中 然而 我们可以将数组插入到 php 文件中 但格式不符合要求 我们有 2 个文件 文件1 php
  • 获取Flask应用程序的根路径

    我正在开发一个 Flask 扩展 我想在文件系统上的项目根路径中创建一个目录 假设我们有这样的目录结构 project app tests my folder manage py my folder 应该由扩展动态创建 它是一个测试实用程序
  • 为什么 findViewById() 在这里不能像 getActivity().findViewById() 一样工作?

    A placeholder fragment containing a simple view public static class PlaceholderFragment extends Fragment public Placehol
  • 如何控制用户输入的地址显示404

    我想在用户输入未知地址时显示 404 页面 如上图所示 之后我可以控制未知地址index php但不知道如何在之前的部分执行此操作index php part 我编写这段代码是为了控制用户输入的内容index php 看起来你的开发机器上有
  • 支持 DOM 样式访问的 Java JSON 库

    我正在用 Java 编写一个 JSON 风格的查询引擎 它将受益于通过 DOM 路径查询 JSON 文档的能力 就像在 Javascript 中所做的那样 我检查过 GSON 和 Jackson 但似乎都不支持这一点 除了我自己的之外 有人
  • Microsoft graph API:无法使用生成的访问令牌获取用户

    我已在 Azure 门户中注册了该应用程序 并生成了 client secret 我需要客户端授权流程 并且我也授予了应用程序权限 我也已授予管理员同意 因为我自己就是管理员 我可以使用给定的 url 生成访问令牌 https login
  • Rails:找不到railties

    rvm v rvm 1 10 2 by Wayne E Seguin lt email protected gt Michal Papis lt email protected gt https rvm beginrescueend com
  • C++的recv()问题

    我想发送一个字符串 Hello there 但我只收到 re 这是为什么 void Accept SOCKADDR IN sock int intsock sizeof sock remoteSocket accept desc LPSOC
  • Vuejs 3如何将变量传递给槽内的所有元素

    我正在使用 VueJs 3 创建一个动态表组件 其中涉及将循环索引变量发送到插槽内的所有子组件 组件的用法如下
  • 无法加载从带有标识符的包中的笔尖引用的图像

    如果需要复制项目 gt 完成 区分大小写 gt 已注意 图像位于项目文件夹内 这里可能有什么问题 Xcode 版本 9 0 我通过将图像导入资产 Assets xcassets 并从那里引用它来解决这个问题 看起来 Xcode 9 中的构建
  • 如何切换浏览器操作的操作?

    我已经创建了我的第一个 chrome 扩展 它将事件处理程序添加到单击时页面上的所有锚元素 如果用户第二次单击该图标 事件处理程序将重新附加到锚元素并执行两次 我需要以下内容 单击浏览器操作 将事件添加到锚元素 如果可能 请在浏览器操作图标
  • 时间:2019-03-17 标签:c#webrequestpostimagetowebapi

    我在将图像上传到我正在运行的 Web API 时遇到问题 使用 GET 请求时 我可以从 Web API 检索数据 但在处理 POST 请求时遇到问题 我需要将 BMP 图像上传到 Web API 然后发回 json 字符串 HttpPos