我写了一个接受字符串和字节参数的WCF restful服务。问题是如果字节为空,Web服务工作正常,但如果byte参数中有值,则会收到以下错误消息:
'反序列化System.Byte []类型的对象时出错。结束元素'文档'来自命名空间''预期。
这是我的代码
WCF界面
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "IDocument")]
string IndexDocument(byte[] Document, string DocumentType);
WCF接口实施
public string IndexDocument(byte[] Document, string DocumentType)
{
}
客户端程序
private class Documentt
{
public byte[] Document { get; set; }
public string DocumentType { get; set; }
}
static async Task RunAsync()
{
byte[] bytes = System.IO.File.ReadAllBytes(openFileDialog.FileName);
var parameters = new Documentt()
{
Document = bytes,
DocumentType = "AA"
};
using (HttpClient client = new HttpClient())
{
var request = new StringContent(JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json");
var response = client.PostAsync(new Uri("http://localhost:59005/ServiceCall.svc/IDocument"), request);
var result = response.Result;
}
}
我在这里做错了什么?我想利用字节,因为我想编写一个跨平台(供java,c ++,c#等使用)web服务。
答案 0 :(得分:1)
这是因为您使用datacontact
作为您的杀菌剂而Json.NET
作为您的灭菌器。请记住,他们对DateTime
和Byte[]
等某种对象的行为方式不同。
请使用此方法序列化您的请求:
public static string DataJsonSerializer<T>(T obj)
{
var json = string.Empty;
var JsonSerializer = new DataContractJsonSerializer(typeof(T));
using (var mStrm = new MemoryStream())
{
JsonSerializer.WriteObject(mStrm, obj);
mStrm.Position = 0;
using (var sr = new StreamReader(mStrm))
json = sr.ReadToEnd();
}
return json;
}
您的请求应该是这样的:
var request = new StringContent(DataJsonSerializer(parameters), Encoding.UTF8, "application/json");