[Mono-bugs] [Bug 619542] New: webHttpBinging is generating wrong responses for methods that return a Stream
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Fri Jul 2 09:24:26 EDT 2010
http://bugzilla.novell.com/show_bug.cgi?id=619542
http://bugzilla.novell.com/show_bug.cgi?id=619542#c0
Summary: webHttpBinging is generating wrong responses for
methods that return a Stream
Classification: Mono
Product: Mono: Class Libraries
Version: 2.6.x
Platform: Macintosh
OS/Version: Mac OS X 10.6
Status: NEW
Severity: Major
Priority: P5 - None
Component: WCF
AssignedTo: atsushi at ximian.com
ReportedBy: clovis.ribeiro at myabcm.com
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us)
AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16
If you write a code like the one below and implement the service, the Microsoft
NET Framework webHttpBinding will understand that you don't want to have the
serialized stream serialized but simply the contents of the stream itself
serialized!
[ServiceContract]
public interface IClientAccessPolicy
{
[OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream GetClientAccessPolicy();
}
Our implementation of GetClientAccessPolicy() is doing the following:
[OperationBehavior]
public Stream GetClientAccessPolicy()
{
#region "Definition dinamic of ClientAccessPolicy.xml file"
const string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from
http-request-headers=""*"">
<domain uri=""http://*""/>
<domain uri=""https://*""/>
</allow-from>
<grant-to>
<resource path=""/""
include-subpaths=""true""/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>";
#endregion
if (WebOperationContext.Current != null)
WebOperationContext.Current.OutgoingResponse.ContentType =
"application/xml";
return new MemoryStream(Encoding.UTF8.GetBytes(result));
}
In Windows (NET Framework) this returns the exact XML code back to the browser,
but in Mono, it returns the Stream object itself serialized.
In short, when getting a method that returns a Stream and is decorated with
WebGetAttribute, the serializer should simply return the stream contents
instead of the serialized stream.
I know this is a bit weird but this is the way Microsoft .NET Works.
Reproducible: Always
Steps to Reproduce:
You can test a code like the one below in MS.NET and Mono (I got this simple
example at http://forums.silverlight.net/forums/p/22952/81273.aspx):
// define the service contract
[ServiceContract]
public interface IFileHost
{
[OperationContract, WebGet(UriTemplate = "Files/{filename}")]
Stream Files(string filename);
}
// implement the service contract
public class Service : IFileHost
{
public Stream Files(string filename)
{
Stream stream = (Stream)new FileStream(filename, FileMode.Open);
//Set the correct context type for the file requested.
int extIndex = filename.LastIndexOf(".");
string extension = filename.Substring(extIndex, filename.Length -
extIndex);
switch(extension)
{
case ".html":
case ".htm":
WebOperationContext.Current.OutgoingResponse.ContentType =
"text/html";
break;
case ".xap":
WebOperationContext.Current.OutgoingResponse.ContentType =
"application/x-silverlight-2-b2";
break;
default:
throw(new ApplicationException("File type not supported"));
}
return stream;
}
}
class Program
{
static void Main(string[] args)
{
string baseAddress = "http://" + Environment.MachineName +
":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new
Uri(baseAddress));
host.AddServiceEndpoint(typeof(IFileHost), new WebHttpBinding(),
"").Behaviors.Add(new WebHttpBehavior());
host.Open();
Console.WriteLine("Service is running");
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
Actual Results:
The result in Mono will be a corrupted file
Expected Results:
The actual file contents
When I got this problem, I decided to implement a MessageInspector and Manually
change the message contents as I really needed to return a raw XML file to the
client in Mono. That's when I got another bug already recorded (bug# 619534)
--
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list