Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Parameter Serializer nullifies incoming byte array

394 views
Skip to first unread message

irwin.williams

unread,
Mar 9, 2006, 11:41:17 AM3/9/06
to
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;
}

}

0 new messages