Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#webrequest将图像发布到web api_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

c#webrequest将图像发布到web api

c#webrequest将图像发布到web api,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我无法将图像上载到正在运行的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 byt

我无法将图像上载到正在运行的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();

}
出于某种原因,我总是在屏幕上看到404
WebException

WebResponse response = request.GetResponse();
我已经检查了URL是否正确。这是我为帖子设置URL格式的方式,还是我犯了其他错误

编辑,添加网络配置路由:

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/formdata
传输文件。下面是一个示例,说明如何在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",
    });
}

您可以使用
multipart/formdata
传输文件。下面是一个示例,说明如何在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",
    });
}

从TestByte方法中删除
字符串有效负载
参数。它会导致错误。您通过
Request.Content.ReadAsByteArrayAsync
方法获取数据。您不需要有效负载对象。 如果你的路线是正确的,它必须这样工作

编辑: 你能像这样更改routeTemplate吗

routeTemplate: "api/{controller}/{id}"

从TestByte方法中删除
字符串有效负载
参数。它会导致错误。您通过
Request.Content.ReadAsByteArrayAsync
方法获取数据。您不需要有效负载对象。 如果你的路线是正确的,它必须这样工作

编辑: 你能像这样更改routeTemplate吗

routeTemplate: "api/{controller}/{id}"

查看您正在将内容设置为多部分/表单数据,但流未编码为多部分,请检查此项:查看您正在将内容设置为多部分/表单数据,但流未编码为多部分,请检查此项:出于某种原因,我在
响应上收到404。ensureccessstatuscode()。我正在调用的URL是
http://localhost:49289/api/upload
,我可以看到本地主机:49289在IIS express中运行。我基本上是复制了你的代码,不知道为什么我不能访问我的web API中的函数。你在web API上使用基于属性的路由吗?在我的示例中,我这样做了,但这假设您已经正确配置了它。如果您正在使用全局路由,请根据您的场景调整代码,不要盲目复制粘贴。我在Web API中启用了基于属性的路由,我编辑了我的原始问题以显示我的WebApiConfigTry从配置中删除全局路由。您不应该将属性与全局路由混合使用。我删除了全局路由,但它仍然不起作用。我仍然得到一个404,但是当我从浏览器调用URL作为get请求时,我得到了
{“Message”:“请求的资源不支持http方法'get'”}
,它看起来就在那里。出于某种原因,我在
响应上得到了一个404。我正在调用的URL是
http://localhost:49289/api/upload
,我可以看到本地主机:49289在IIS express中运行。我基本上是复制了你的代码,不知道为什么我不能访问我的web API中的函数。你在web API上使用基于属性的路由吗?在我的示例中,我这样做了,但这假设您已经正确配置了它。如果您正在使用全局路由,请根据您的场景调整代码,不要盲目复制粘贴。我在Web API中启用了基于属性的路由,我编辑了我的原始问题以显示我的WebApiConfigTry从配置中删除全局路由。您不应该将属性与全局路由混合使用。我删除了全局路由,但它仍然不起作用。我仍然得到一个404,但是当我从浏览器中调用URL作为get请求时,我得到了
{“Message”:“请求的资源不支持http方法'get'。}
,它看起来就在那里。关于有效负载参数,您是对的,我添加了它以测试它是否会更改某些内容,我再次删除了它。我正在使用
Request.Content.ReadAsByteArrayAsync
,但我认为我的路由有问题。我不确定在我的路线中寻找什么来解决问题。它应该可以工作,但是当发布数据时,我得到了一个404。关于有效负载参数,你是对的,我添加了它来测试它是否会改变某些东西,我再次删除了它。我正在使用
Request.Content.ReadAsByteArrayAsync
,但我认为我的路由有问题。我不确定在我的路线中寻找什么来解决问题。它应该可以工作,但当发布数据时,我得到了404。