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)
    {

「test」オブジェクトで、「MyString」プロパティを除く、クライアントから送信したすべてのプロパティの値を取得しています。常にnullになります。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 に答える