Parameter Serializer nullifies incoming byte array (x-post)

Discussion in 'ASP .Net Web Services' started by irwin.williams@gmail.com, Mar 13, 2006.

  1. Guest

    Hi, i posted this message in the WSE group
    (http://groups.google.com/group/microsoft.public.dotnet.framework.webservices.enhancements)
    but got no response.

    Hello
    I am using web services to send arrays of bytes inside of messages.
    The actual service i am using is hosted outside of IIS using Aaron
    Skonnard's HTTPSys transport
    http://pluralsight.com/blogs/aaron/archive/2005/10/14/15571.aspx, and i

    am also using Custom Soap Filters to edit specific messages.

    When i send a message containing properties which may themselves
    contain arrays of bytes the actual message as a parameter of given
    methods on the service contains the properties, except that the actual
    array is empty (size = 0).


    Via investigation of the methods called on the service (which extends
    SoapService from WSE 3.0) , I was aided greatly by Lutz's .Net
    Reflector http://www.aisto.com/roeder/dotnet/, I have found that the
    call to Invoke the method on the webservice somehow causes the byte
    array inside of the soap envelope to be made empty.


    I have produced a small project, which i hope explains the exact issue
    i am trying to deal with. Please see the code below. Any light shed
    on this matter would be most appreciated.


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml;
    using System.Xml.Serialization;
    using Microsoft.Web.Services3;
    using System.Reflection;
    using System.Web.Services.Description;


    namespace ParameterSerializerTest
    {
    [WebService(Name = "ParameterSerializerNullBytes", Namespace =
    tempnamespace)]
    public class ParameterSerializerNullBytes
    {
    public const string tempnamespace =
    "http://myNamespace.org";


    public static void Main(string[] args)
    {
    #region Create Attachments
    SpecialAttachment spa = new
    SpecialAttachment();
    spa.content = new byte[] { 1, 2, 3, 4, 5, 6, 7,
    8, 9, 0 };
    spa.name = "speelunks";
    AttachmentContainer atc = new
    AttachmentContainer();
    atc.attachments = new
    List<SpecialAttachment>();
    atc.attachments.Add(spa);
    atc.containername = "containerforspeelunks";
    #endregion


    SoapEnvelope env = new SoapEnvelope();
    env.SetBodyObject(atc, tempnamespace);


    #region Use reflection to get access to the
    Parameter Serializer
    Type receiverType =
    typeof(ParameterSerializerNullBytes);
    MethodInfo selectedMethodInfo =
    receiverType.GetMethod("Deliver");
    LogicalMethodInfo logicalMethodInfo = new
    LogicalMethodInfo(selectedMethodInfo);
    SoapServerMethod selectedMethod = new
    SoapServerMethod(receiverType,
    logicalMethodInfo);


    #endregion


    #region Use the serializer to get the
    AttachmentContainer out of the
    SoapEnvelope
    XmlReader reader = env.GetBodyReader();
    object[] oArray = null;
    reader.ReadStartElement(reader.LocalName,
    reader.NamespaceURI);
    reader.MoveToContent();
    oArray =
    (object[])selectedMethod.ParameterSerializer.Deserialize(reader,
    (selectedMethod.BindingUse == SoapBindingUse.Encoded) ?
    env.CurrentSoap.EncodingStyle : null);
    reader.Close();
    #endregion


    AttachmentContainer atcReturned = oArray[0] as
    AttachmentContainer;


    Console.WriteLine("content byte size BEFORE
    inserting into the
    SoapEnvelope: "+ Environment.NewLine +
    atc.attachments[0].content.Length);


    Console.WriteLine("content byte size AFTER
    using the serializer:" +
    Environment.NewLine + atcReturned.attachments[0].content.Length);


    AttachmentContainer atcFromEnvelope =
    (AttachmentContainer)env.GetBodyObject(typeof(AttachmentContainer),
    tempnamespace);
    Console.WriteLine("content byte size AFTER
    inserting into the
    SoapEnvelope:" + Environment.NewLine +
    atcFromEnvelope.attachments[0].content.Length);


    Console.Read();
    }


    [SoapDocumentMethodAttribute("Deliver",
    Use = SoapBindingUse.Literal,
    ParameterStyle = SoapParameterStyle.Bare)]
    public void Deliver([XmlElement(Namespace =
    tempnamespace,
    ElementName = "AttachmentContainer")] AttachmentContainer atc)
    {
    }
    }


    [XmlType(Namespace =
    ParameterSerializerNullBytes.tempnamespace,
    TypeName = "SpecialAttachment")]
    public class SpecialAttachment
    {
    [XmlElement(typeof(byte[]))]
    public byte[] content;
    [XmlElement()]
    public string name;
    }


    [XmlType(Namespace =
    ParameterSerializerNullBytes.tempnamespace,
    TypeName = "AttachmentContainer")]
    public class AttachmentContainer
    {
    [XmlArray()]
    public List<SpecialAttachment> attachments;
    [XmlElement()]
    public string containername;
    }

    }
    , Mar 13, 2006
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Bharat Bhushan

    Appending byte[] to another byte[] array

    Bharat Bhushan, Aug 5, 2003, in forum: Java
    Replies:
    15
    Views:
    40,207
    Roedy Green
    Aug 5, 2003
  2. Kirby
    Replies:
    3
    Views:
    624
    Kirby
    Oct 8, 2004
  3. Replies:
    3
    Views:
    978
    Gabriel Genellina
    Jul 23, 2009
  4. Joseph Ellis
    Replies:
    14
    Views:
    162
    Joseph Ellis
    Jul 25, 2003
  5. Tom
    Replies:
    6
    Views:
    82
    Thomas 'PointedEars' Lahn
    Jan 16, 2009
Loading...

Share This Page