c#webrequest将图像发布到web api
我无法将图像上载到正在运行的Web API。当使用GET请求时,我可以从Web API检索数据,但是POST请求有问题。我需要上传一个BMP图像到Web API,然后发回一个json字符串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
[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();
}
出于某种原因,我总是在屏幕上看到404WebException
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。