[Mono-list] webHttpBinding WebInvoke POST issue

Nadeem Backus nadeem.backus at gmail.com
Mon Jun 13 05:00:26 EDT 2011


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>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
>> http://lists.ximian.com/mailman/listinfo/mono-list
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20110613/43dd6c4a/attachment.html 


More information about the Mono-list mailing list