1

在获取从客户端发送到服务器上的 WCF 服务的 base64 编码字符串时,我遇到了一个奇怪的问题。在我的 WCF 服务方法中,此字符串始终为 null。我的商务舱是:

[DataContract(Namespace = "")]
public class Test
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public int Name { get; set; }
    [DataMember]
    public int Age { get; set; }
    [DataMember]
    public string MyString { get; set; }
}

我正在将 xml 中的帖子数据发送到我的 WCF 服务:

    string data = string.Format("<Test><Id>{0}</Id><Name>{1}</Name><Age>{2}</Age><MyString>{3}</MyString></Test>",
        1, "name", 20, Convert.ToBase64String(image));//image is in bytes

上面的“图像”以字节为单位。

在 MyTestService.svc.cs 中的服务器上接收客户端数据时:

  public void CreateTest(Test test)
    {

在“测试”对象中,我得到了从客户端发送的所有属性的值,除了“MyString”属性。它总是空的。我在 Fiddler 中仔细检查了 xml 中的“MyString”标签包含 base64 编码的字符串。你能帮我解决这个问题吗?

xml 标签中属性值的长度是否有限制。图像的编码字符串足够长。

4

1 回答 1

2

DataContractSerializerWCF 的默认序列化程序)强制数据协定中元素的顺序。如果您没有使用Order属性的[DataMember]属性显式指定顺序,则默认顺序是字母顺序。尝试按该顺序(Age、Id、MyString、Name)发送请求,您应该会看到 MyString 的值正确填充。

public class StackOverflow_12693581
{
    [DataContract(Namespace = "", Name = "Test")]
    public class TestData
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public string MyString { get; set; }
    }
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        void Process(TestData test);
    }
    public class Service : ITest
    {
        public void Process(TestData test)
        {
            Console.WriteLine("MyString: {0}", test.MyString ?? "<<NULL>>");
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        byte[] image = Enumerable.Range(1, 100).Select(i => (byte)i).ToArray();

        WebClient c = new WebClient();
        Console.WriteLine("Order as in the question");
        string data = string.Format("<Test><Id>{0}</Id><Name>{1}</Name><Age>{2}</Age><MyString>{3}</MyString></Test>",
            1, "name", 20, Convert.ToBase64String(image));//image is in bytes 
        c.Headers[HttpRequestHeader.ContentType] = "text/xml";
        c.UploadString(baseAddress + "/Process", data);
        Console.WriteLine();

        c = new WebClient();
        Console.WriteLine("Correct order");
        data = string.Format("<Test><Age>{2}</Age><Id>{0}</Id><MyString>{3}</MyString><Name>{1}</Name></Test>",
            1, "name", 20, Convert.ToBase64String(image));//image is in bytes 
        c.Headers[HttpRequestHeader.ContentType] = "text/xml";
        c.UploadString(baseAddress + "/Process", data);

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2012-10-02T16:03:49.573 回答