我试过发布这么多不同的方式,但还没有进一步。我现在的解决方案返回以下错误消息:
传入的消息具有意外的消息格式“Raw”。该 操作的预期消息格式是'Xml'; 'Json的'。这个可以 是因为尚未配置WebContentTypeMapper 捆绑。有关更多信息,请参阅WebContentTypeMapper的文档 的信息。
RestService方法:
[WebInvoke(Method = "POST",ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "UploadUser/{sessionID}/{Name}")]
[OperationContract(Name = "UploadUser")]
string UploadUser(string sessionID, string name, byte[] image);
尝试发布到服务:
client = new HttpClient();
client.MaxResponseContentBufferSize = 256000;
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
public async Task<string> SaveUserItemAsync(User item, bool isNewItem = false)
{
try
{
var RestUrl = "http://192.168.240.127:55642/RestServiceImpl.svc/UploadUser/{0}/{1}";
var uri = new Uri(string.Format(RestUrl, item.Id, item.Name));
var base64String = Convert.ToBase64String(item.Thumbnail, 0, item.Thumbnail.Length);
var jsonStr = JsonConvert.SerializeObject(base64String);
var messageBytes = System.Text.Encoding.UTF8.GetBytes(jsonStr);
var cont = new ByteArrayContent(messageBytes);
cont.Headers.ContentType= MediaTypeHeaderValue.Parse("text/plain");
//also tried cont.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
//also tried sending it as stringcontent
//var json = JsonConvert.SerializeObject(item.Thumbnail);
//var content = new StringContent(json, Encoding.UTF8, "application/json");
//also tried multipartcontent with no luck
//var multipartContent = new MultipartFormDataContent();
//multipartContent.Add(cont, "image");
if (isNewItem)
{
var response = await client.PostAsync(uri, cont).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
var res = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return res;
Debug.WriteLine(@"User successfully saved.");
}
}
}
catch (Exception ex)
{
}
}
使用cont.Headers.ContentType = MediaTypeHeaderValue.Parse(“application / json”);
我得到另一个错误消息:
反序列化操作请求消息正文时出错 'UploadUser'。 OperationFormatter遇到无效的Message正文。 期望找到名称为“type”且值为“object”的属性。 找到值'string'。
Wireshark显示了这一点:
更改了发送方式:
var senderPackage = new Dictionary<string, byte[]>
{
{"image", messageBytes}
};
var json = JsonConvert.SerializeObject(senderPackage);
var content = new StringContent(json, Encoding.UTF8, "application/json");
出现新错误:
格式化程序在尝试反序列化时抛出异常 消息:尝试反序列化参数时出错 http://tempuri.org/:image。 InnerException消息是'有的 反序列化System.Byte []类型的对象时出错。结束元素 来自命名空间'''的'image'。找到文字 “Ii85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JEQUJzU0ZCY1VFUnNYRmhjZUhCc2dLRUlyS0NVbEtGRTZQVEJDWUZWbFpGOVZYVnRxZUptQmFuR1FjMXRkaGJXR2tKNmpxNjJyWjRDOHlicW14NW1vcTZULzJ3QkRBUndlSGlnaktFNHJLMDZrYmwxdXBLU2twS1NrcEtTa3BLU2twS1NrcEtTa3BLU2twS ..
Wireshark数据包如下所示:
如果有人知道如何让这个工作,我将永远负债;)
答案 0 :(得分:0)
你应该使用&#34; application / json&#34;作为JSON请求标头中的媒体类型。
尝试:
RequestFormat = WebMessageFormat.Json
到您的interface
身体应该包含一个关键的图像&#39;值为字节列表。
1. Make a dictionary with key "image" and with value array of bytes.
2. Serialize the dictionary to Json
3. Use StringContent insead of ByteArray Content
答案 1 :(得分:0)
我最终通过创建自己的DataContract并将其作为流发送来使其工作。插入代码,任何人最终都会遇到同样的问题。
[DataContract]
public class UploadObject
{
[DataMember(Name = "image")]
public byte[] image { get; set; }
}
休息服务方法:
[OperationContract(Name = "UploadUser")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "UploadUser/{sessionID}/{Name}")]
string UploadUser(string sessionID, string name, Stream image);
张贴休息:
public async Task<string> SaveUserItemAsync(User item, bool isNewItem = false)
{
try
{
var RestUrl = "http://192.168.240.127:55642/RestServiceImpl.svc/UploadUser/{0}/{1}";
var uri = new Uri(string.Format(RestUrl, item.Id, item.Name));
UploadObject obj = new UploadObject();
obj.image = item.Thumbnail;
var json = JsonConvert.SerializeObject(obj);
var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
var content = new StreamContent(stream);
content.Headers.ContentLength = stream.Length;
if (isNewItem)
{
var response = await client.PostAsync(uri, content).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
var res = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return res;
}
return "success";
}
}
catch (Exception ex)
{
}
return "Failure";
}
几天后,服务开始抱怨它不能接受多个参数以及流输入,所以我将其更改为接收bytearray并设法通过创建我自己的jason来格式化bytearray这样:
var json = "{ \"image\": [" + string.Join(",", item.Thumbnail) + "] }";
var content = new StringContent(json);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
var response = await client.PostAsync(uri, content).ConfigureAwait(false);