【问题标题】:Encoded string coming out null in WCF requestWCF 请求中的编码字符串为空
【发布时间】:2012-10-02 15:38:16
【问题描述】:

在获取从客户端发送到服务器上的 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 标签中的属性值的长度是否有限制。图片的编码字符串足够长。

【问题讨论】:

  • 这可能是一个无用的检查,但只是为了完全确保您可以检查并确保您的最终 XML(数据)验证:xmlvalidation.com
  • 我刚刚做了,没有错误。
  • "xml标签中属性值的长度是否有限制。图片的编码字符串足够长。" - 你能不能只创建一个非常小的图像并测试它是否是你的问题?或者也许在测试时只是尝试在尝试发送编码图像之前发送一个标准字符串......

标签: c# asp.net wcf rest


【解决方案1】:

DataContractSerializer(WCF 的默认序列化程序)强制数据协定中元素的顺序。如果您没有使用[DataMember] 属性的Order 属性显式指定顺序,则默认顺序是字母顺序。尝试按该顺序(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();
    }
}

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 2012-08-17
    • 2011-09-26
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多