[Mono-list] webHttpBinding WebInvoke POST issue

Atsushi Eno atsushieno at veritas-vos-liberabit.com
Mon Jun 13 07:10:47 EDT 2011


Hi Nadeem,

Nice, thanks. Now I can see the problem. So far I have "implemented" 
OnWriteBodyContents() as to write dummy output, and the exact problem is 
gone (done in git master/mono-2-10 branches).
There is another issue, looks like .NET WCF treats Stream parameter in 
special manner that we didn't have done yet. I'll investigate that issue 
too.

Atsushi Eno

(2011/06/13 18:00), Nadeem Backus wrote:
> Hi Atsushi,
>
> I found an example that exhibits the same problem in mono, its taken from:
> http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx
>
>
>
> using System;
> using System.Collections.Generic;
> using System.IO;
> using System.Linq;
> using System.Net;
> using System.ServiceModel;
> using System.ServiceModel.Description;
> using System.ServiceModel.Web;
> using System.Text;
>
> namespace HttpPst
> {
>     class Program
>     {
>         static void Main(string[] args)
>         {
>
>          Test();
>
>         }
>
>         public static void Test()
>         {
>             string baseAddress = "http://" + Environment.MachineName +
> ":8000/Service";
>             ServiceHost host = new ServiceHost(typeof(Service), new
> Uri(baseAddress));
>             host.AddServiceEndpoint(typeof(ITest), new
> WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
>             host.Open();
>             Console.WriteLine("Host opened");
>
>             HttpWebRequest req =
> (HttpWebRequest)HttpWebRequest.Create(baseAddress +
> "/UploadFile/Test.txt");
>             req.Method = "POST";
>             req.ContentType = "text/plain";
>             Stream reqStream = req.GetRequestStream();
>             byte[] fileToSend = new byte[12345];
>             for (int i = 0; i < fileToSend.Length; i++)
>             {
>                 fileToSend[i] = (byte)('a' + (i % 26));
>             }
>             reqStream.Write(fileToSend, 0, fileToSend.Length);
>             reqStream.Close();
>             HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
>             Console.WriteLine("HTTP/{0} {1} {2}",
> resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
>             host.Close();
>         }
>
>
>
>     }
>         [ServiceContract]
>         public interface ITest
>         {
>             [OperationContract, WebInvoke(UriTemplate =
> "UploadFile/{fileName}")]
>             void UploadFile(string fileName, Stream fileContents);
>         }
>         public class Service : ITest
>         {
>             public void UploadFile(string fileName, Stream fileContents)
>             {
>                 byte[] buffer = new byte[10000];
>                 int bytesRead, totalBytesRead = 0;
>                 do
>                 {
>                     bytesRead = fileContents.Read(buffer, 0,
> buffer.Length);
>                     totalBytesRead += bytesRead;
>                 } while (bytesRead > 0);
>                 Console.WriteLine("Uploaded file {0} with {1} bytes",
> fileName, totalBytesRead);
>             }
>         }
>
>     }
>
> Hope that helps
>
> Nadeem
>
>
> On 13 June 2011 08:20, Atsushi Eno
> <atsushieno at veritas-vos-liberabit.com
> <mailto:atsushieno at veritas-vos-liberabit.com>> wrote:
>
>     Hello,
>
>     NotSupportedException is not NotImplementedException, so it is
>     likely intended to actually throw that error. It is still possible
>     that the WCF internal goes wrong path and reaches that
>     WriteMessage() part, but without actual code to examine I cannot
>     guess for sure.
>
>     Atsushi Eno
>
>
>     (2011/06/13 7:40), Nadeem Backus wrote:
>
>         Dear All,
>
>         I have implemented a service operation which recieves a file
>         (multipart) via  HTTP POST (as a stream) from an asyncronous
>         uploader (SWFupload), this has been done using the
>         webHttpBinding  in system.servicemodel.web. The service is
>         running as a console host on an unbuntu 10.10 system with mono
>         2.10, it fails in this environment yet works in .net 4.0 in
>         windows. I am getting the following exception when a post is
>         attempted:
>
>
>         Unhandled Exception: System.NotSupportedException: Operation
>         is not supported.
>          at
>         System.ServiceModel.Dispatcher.WebMessageFormatter+RawMessage.OnWriteBodyContents
>         (System.Xml.XmlDictionaryWriter writer) [0x00000] in <filename
>         unknown>:0
>          at System.ServiceModel.Channels.Message.WriteBodyContents
>         (System.Xml.XmlDictionaryWriter writer) [0x00000] in <filename
>         unknown>:0
>          at System.ServiceModel.Channels.Message.OnCreateBufferedCopy
>         (Int32 maxBufferSize) [0x00000] in <filename unknown>:0
>          at System.ServiceModel.Channels.Message.CreateBufferedCopy
>         (Int32 maxBufferSize) [0x00000] in <filename unknown>:0
>          at System.ServiceModel.Logger.LogMessage
>         (MessageLogSourceKind sourceKind,
>         System.ServiceModel.Channels.Message& msg, Int32
>         maxMessageSize) [0x00000] in <filename unknown>:0
>          at
>         System.ServiceModel.Channels.Http.HttpReplyChannel.TryReceiveRequest
>         (TimeSpan timeout,
>         System.ServiceModel.Channels.RequestContext& context)
>         [0x00000] in <filename unknown>:0
>          at
>         System.ServiceModel.Channels.ReplyChannelBase.<BeginTryReceiveRequest>m__20
>         (TimeSpan tout, System.ServiceModel.Channels.RequestContext&
>         ctx) [0x00000] in <filename unknown>:0
>
>
>         The Operation Contract code is this:
>
>                [OperationContract]
>                [WebInvoke(Method = "POST", BodyStyle =
>         WebMessageBodyStyle.Bare, UriTemplate = "/UploadImage")]
>                Stream UploadImage(Stream data);
>
>
>         Having looked though the library source code I see that
>         RawMessage has been implemented (I am unsure to what extend it
>         has been completed) , but OnWriteBodyContents is throwing a
>         not supported exception. How else can I get access to the
>         posted stream data?
>
>         Any help will be greatly appreciated, thank you in advance :-)
>
>         Nadeem
>
>
>         _______________________________________________
>         Mono-list maillist  - Mono-list at lists.ximian.com
>         <mailto:Mono-list at lists.ximian.com>
>         http://lists.ximian.com/mailman/listinfo/mono-list
>
>
>



More information about the Mono-list mailing list