【发布时间】:2017-05-15 14:41:59
【问题描述】:
我尝试了很多不同的方式发布,但还没有进一步。我现在的解决方案返回以下错误消息:
传入的消息具有意外的消息格式“原始”。这 该操作的预期消息格式为“Xml”; '杰森'。这个可以 是因为没有配置 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");
我收到另一个错误消息:
反序列化操作请求消息正文时出错 '上传用户'。 OperationFormatter 遇到无效的消息正文。 预计会找到名称为“类型”且值为“对象”的属性。 找到值“字符串”。
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[] 类型的对象时出错。末端元件 来自命名空间“”的“图像”应为预期。找到的文字 'Ii85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JEQUJzU0ZCY1VFUnNYRmhjZUhCc2dLRUlyS0NVbEtGRTZQVEJDWUZWbFpGOVZYVnRxZUptQmFuR1FjMXRkaGJXR2tKNmpxNjJyWjRDOHlicW14NW1vcTZULzJ3QkRBUndlSGlnaktFNHJLMDZrYmwxdXBLU2twS1NrcEtTa3BLU2twS1NrcEtTa3BLU2twS..
Wireshark 数据包看起来像这样:
如果有人知道如何让它发挥作用,我将永远欠你的债;)
【问题讨论】:
-
工作解决方案: 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);