将图片上传到 oData 网络服务
Upload a picture to oData web service
在我的 oData 网络服务中,我有一个名为 Ware
的业务对象。此 Ware
有一个名为 Picture
的 Image
类型的 属性。当我想使用 HttpClient
在 UWP 应用程序中获取图片时,我只需调用 http://localhost:8797/Data/Ware(2)/Picture
。代码如下:
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Clear();
using (HttpResponseMessage message = await client.GetAsync(url))
{
message.EnsureSuccessStatusCode();
var content = (StreamContent)message.Content;
return await content.ReadAsByteArrayAsync();
}
}
这是按预期工作的,return我把图片作为数组的字节。
现在我想通过 'PUT' 上传新的 Picture
。我试过下面的代码:
public static async Task PutImage(string url, byte[] image)
{
var handler = new HttpClientHandler { UseDefaultCredentials = true };
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Clear();
using (var ms = new MemoryStream(image))
{
using (var message = await client.PutAsync(url, httpContent))
{
message.EnsureSuccessStatusCode();
}
}
}
}
然后当我调用 PutImage("Ware(2)/Picture", myFile.toByteArray())
时,我会收到 Bad Request
响应。
有趣的是,当我用 Postman 尝试 PUT
时,它工作正常。正如您在下图中看到的,我得到了 204 结果并且我的图片已成功更改。
Screenshot: Postman is successful sending the file with a 'PUT' verb to the odata server
谁能帮我解决这个问题?
这是 Postman 生成的代码:
PUT /Data/Ware(2)/Picture HTTP/1.1
Host: localhost:8797
Authorization: Basic QWRtaW46
Cache-Control: no-cache
Postman-Token: 37827f09-8841-7ccb-c462-d488ef4c4e9d
undefined
我做了很多谷歌搜索。但没有希望。 :(
终于搞定了:)
public static async Task PutImage(string url, byte[] image)
{
var httpContent = new ByteArrayContent(image);
var handler = new HttpClientHandler { UseDefaultCredentials = true };
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
using (var request = new HttpRequestMessage(HttpMethod.Put, url) { Content = httpContent })
{
httpContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
using (var message = await client.SendAsync(request))
{
message.EnsureSuccessStatusCode();
}
}
}
}
一切正常。
在我的 oData 网络服务中,我有一个名为 Ware
的业务对象。此 Ware
有一个名为 Picture
的 Image
类型的 属性。当我想使用 HttpClient
在 UWP 应用程序中获取图片时,我只需调用 http://localhost:8797/Data/Ware(2)/Picture
。代码如下:
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Clear();
using (HttpResponseMessage message = await client.GetAsync(url))
{
message.EnsureSuccessStatusCode();
var content = (StreamContent)message.Content;
return await content.ReadAsByteArrayAsync();
}
}
这是按预期工作的,return我把图片作为数组的字节。
现在我想通过 'PUT' 上传新的 Picture
。我试过下面的代码:
public static async Task PutImage(string url, byte[] image)
{
var handler = new HttpClientHandler { UseDefaultCredentials = true };
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Clear();
using (var ms = new MemoryStream(image))
{
using (var message = await client.PutAsync(url, httpContent))
{
message.EnsureSuccessStatusCode();
}
}
}
}
然后当我调用 PutImage("Ware(2)/Picture", myFile.toByteArray())
时,我会收到 Bad Request
响应。
有趣的是,当我用 Postman 尝试 PUT
时,它工作正常。正如您在下图中看到的,我得到了 204 结果并且我的图片已成功更改。
Screenshot: Postman is successful sending the file with a 'PUT' verb to the odata server
谁能帮我解决这个问题?
这是 Postman 生成的代码:
PUT /Data/Ware(2)/Picture HTTP/1.1
Host: localhost:8797
Authorization: Basic QWRtaW46
Cache-Control: no-cache
Postman-Token: 37827f09-8841-7ccb-c462-d488ef4c4e9d
undefined
我做了很多谷歌搜索。但没有希望。 :(
终于搞定了:)
public static async Task PutImage(string url, byte[] image)
{
var httpContent = new ByteArrayContent(image);
var handler = new HttpClientHandler { UseDefaultCredentials = true };
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(DataServiceAddress + "Data/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
using (var request = new HttpRequestMessage(HttpMethod.Put, url) { Content = httpContent })
{
httpContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
using (var message = await client.SendAsync(request))
{
message.EnsureSuccessStatusCode();
}
}
}
}
一切正常。