WCF - 如何反序列化字节参数

时间:2017-06-06 22:21:05

标签: c# json wcf

我写了一个接受字符串和字节参数的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服务。

1 个答案:

答案 0 :(得分:1)

这是因为您使用datacontact作为您的杀菌剂而Json.NET作为您的灭菌器。请记住,他们对DateTimeByte[]等某种对象的行为方式不同。 请使用此方法序列化您的请求:

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");