示例#1
0
        public void UploadValuesAsync(Uri address, NameValueCollection data)
        {
            this.UploadValuesTaskAsync(
                address,
                data
                ).ContinueWith(
                t =>
            {
                var e = new __UploadValuesCompletedEventArgs {
                    Result = t.Result
                };

                if (UploadValuesCompleted != null)
                {
                    UploadValuesCompleted(null, (UploadValuesCompletedEventArgs)(object)e);
                }
            }
                );
        }
示例#2
0
        public Task <byte[]> UploadValuesTaskAsync(Uri address, NameValueCollection data)
        {
            // X:\jsc.svn\examples\actionscript\Test\TestWorkerUploadValuesTaskAsync\TestWorkerUploadValuesTaskAsync\ApplicationSprite.cs
            // https://forums.adobe.com/thread/1189679

            var xx = new TaskCompletionSource <byte[]>();

            // X:\jsc.svn\examples\actionscript\Test\TestUploadValuesTaskAsync\TestUploadValuesTaskAsync\ApplicationSprite.cs

            var request = new URLRequest(address.ToString())
            {
                method = URLRequestMethod.POST
            };

            // should we use dynamic instead?
            var x = new DynamicContainer {
                Subject = new URLVariables()
            };

            foreach (var item in data.AllKeys)
            {
                x[item] = data[item];
            }

            // http://stackoverflow.com/questions/12774611/urlrequest-urlloader-auto-converting-post-request-to-get
            // !!!!
            request.data = (object)x.Subject;
            //request.contentType = ""

            var loader = new URLLoader();

            // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLLoaderDataFormat.html
            //loader.dataFormat = URLLoaderDataFormat.Binary;
            loader.dataFormat = "binary";
            // http://stackoverflow.com/questions/7816231/how-to-use-as3-to-load-binary-data-from-web-server

            loader.complete +=
                args =>
            {
                // If the dataFormat property is URLLoaderDataFormat.BINARY, the received data is a ByteArray object
                // containing the raw binary data.

                //                TypeError: Error #1034: Type Coercion failed: cannot convert ScriptCoreLib.Shared.BCLImplementation.System.Net::__DownloadStringCompletedEventArgs@5422ad9 to ScriptCoreLib.Shared.BCLImplementation.System.Net.__UploadValuesCompletedEventArgs.
                //at ScriptCoreLib.ActionScript.BCLImplementation.System.Net::__WebClient/_UploadValuesAsync_b__7_4ebbe596_06000fb2()[V:\web\ScriptCoreLib\ActionScript\BCLImplementation\System\Net\__WebClient.as:143]
                //at flash.events::EventDispatcher/dispatchEventFunction()
                //at flash.events::EventDispatcher/dispatchEvent()
                //at flash.net::URLLoader/redirectEvent()

                // TypeError: Error #1034: Type Coercion failed: cannot convert ScriptCoreLib.Shared.BCLImplementation.System.Net::__DownloadStringCompletedEventArgs@53686e9 to ScriptCoreLib.Shared.BCLImplementation.System.Net.__UploadValuesCompletedEventArgs.

                //throw new Exception(
                //    new { loader.data, loader.dataFormat, t = loader.data.GetType() }.ToString()
                //);

                var bytes  = (ByteArray)loader.data;
                var Result = (byte[])bytes.ToArray();

                //if (UploadValuesCompleted != null)
                //    UploadValuesCompleted(this, (UploadValuesCompletedEventArgs)(object)e);

                xx.SetResult(Result);
            };

            loader.ioError +=
                args =>
            {
                var e = new __UploadValuesCompletedEventArgs {
                    Error = new Exception("ioError")
                };
                //if (UploadValuesCompleted != null)
                //    UploadValuesCompleted(this, (UploadValuesCompletedEventArgs)(object)e);

                throw e.Error;
            };


            loader.securityError +=
                args =>
            {
                var e = new __UploadValuesCompletedEventArgs
                {
                    Error = new Exception(
                        "securityError " + new { args.errorID, args.text }
                        )
                };

                //if (UploadValuesCompleted != null)
                //    UploadValuesCompleted(this, (UploadValuesCompletedEventArgs)(object)e);

                throw e.Error;
            };

            loader.load(request);

            return(xx.Task);
        }
示例#3
0
文件: WebClient.cs 项目: wclwksn/code
        public void UploadValuesAsync(Uri address, NameValueCollection data)
        {
            //Console.WriteLine("enter WebClient.UploadValuesAsync");

            // called by
            // X:\jsc.svn\core\ScriptCoreLib.Ultra\ScriptCoreLib.Ultra\JavaScript\Remoting\InternalWebMethodRequest.cs


            // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140119

            var x = new IXMLHttpRequest();

            x.open(Shared.HTTPMethodEnum.POST, address.ToString(), async: true);
            x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


            var xFormDataString = ToFormDataString(data);

            //Uncaught InvalidStateError: Failed to execute 'send' on 'XMLHttpRequest': the object's state must be OPENED.
            // X:\jsc.svn\examples\javascript\Test\TestUploadValuesAsync\TestUploadValuesAsync\Application.cs

            // UploadValuesAsync { responseType = , response = <document><TaskComplete><TaskResult>13</TaskResult></TaskComplete></document> }

            x.InvokeOnComplete(
                delegate
            {
                #region complete
                var response = new byte[0];

                // UploadValuesAsync { status = 204, responseType = arraybuffer, response = [object Uint8ClampedArray] }

                //if (x.status == 204)
                // 304?
                //if (x.status == IXMLHttpRequest.HTTPStatusCodes.NoContent)
                //{
                //    // android webview  wants us to do this
                //    response = new byte[0];
                //}

                //Uncaught InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest':
                // The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').

                // X:\jsc.svn\examples\javascript\android\com.abstractatech.battery\com.abstractatech.battery\ApplicationWebService.cs
                //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType });

                //I/chromium(10616): [INFO:CONSOLE(36216)] "%c0:576ms UploadValuesAsync { status = 204, responseType = arraybuffer }", source: http://192.168.1.103:10129/view-source (36216)
                //I/chromium(10616): [INFO:CONSOLE(49940)] "Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.", source: http://192.168.1.103:10129/view-source (49940)

                // what about android webview?
                if (x.response == null)
                {
                    //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, x.response, x.responseText });

                    //I/Web Console( 5012): %c0:198484ms UploadValuesAsync { status = 200, responseType = arraybuffer } at http://192.168.43.1:9417/view-source:37081
                    //I/Web Console( 5012): %c0:198500ms UploadValuesAsync { status = 200, responseType = arraybuffer, response = , responseText = <document><avatar><obj>aHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzhlNmQzZGUw
                    //I/Web Console( 5012): %c0:198524ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:9417/view-source:37081

                    // did we not fix it already?
                    // android 2.3 only seems to have responseText

                    // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201404/20140413

                    try
                    {
                        response = Encoding.UTF8.GetBytes(x.responseText);
                    }
                    catch
                    {
                        //I/chromium(30556): [INFO:CONSOLE(37861)] "%c92:28288ms UploadValuesAsync { status = 204, responseType = arraybuffer }", source: http://192.168.43.7:4394/view-source (37861)
                        //I/chromium(30556): [INFO:CONSOLE(37861)] "%c92:28290ms responseText failed. thanks webview devs. { status = 204 }", source: http://192.168.43.7:4394/view-source (37861)

                        // X:\jsc.svn\examples\javascript\p2p\SharedBrowserSessionExperiment\SharedBrowserSessionExperiment\ApplicationWebService.cs
                        Console.WriteLine("responseText failed. thanks webview devs. " + new { x.status });
                    }
                }
                else
                {
                    // http://stackoverflow.com/questions/8022425/getting-blob-data-from-xhr-request

                    var a = (ArrayBuffer)x.response;

                    //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, a.byteLength });

                    // IE?
                    //var u8 = new Uint8Array(array: a);

                    // X:\jsc.svn\core\ScriptCoreLib.Async\ScriptCoreLib.Async\JavaScript\DOM\FileEntryAsyncExtensions.cs
                    var u8c = new Uint8ClampedArray(array: a);

                    response = u8c;
                }

                //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, response });

                var e = new __UploadValuesCompletedEventArgs {
                    Result = response
                };

                #region ResponseHeaders
                this.ResponseHeaders = new WebHeaderCollection();
                //this.ResponseHeaders.Clear();

                var ResponseHeaders = x.getAllResponseHeaders();
                //0:8209ms { ResponseHeaders = Date: Sat, 15 Mar 2014 12:25:45 GMT
                //Server: ASP.NET Development Server/11.0.0.0
                //X-AspNet-Version: 4.0.30319
                //ETag: BqShORsRkdny750pWBdVyQ==
                //X-ElapsedMilliseconds: 10
                //Content-Type: text/xml; charset=utf-8
                //Access-Control-Allow-Origin: *
                //Cache-Control: private
                //Connection: Close
                //Content-Length: 239

                foreach (var item in ResponseHeaders.Split('\n'))
                {
                    var u = item.IndexOf(":");

                    var ukey   = item.Substring(0, u);
                    var uvalue = item.Substring(u + 1).Trim();

                    this.ResponseHeaders[ukey] = uvalue;
                }
                #endregion

                //Console.WriteLine(new { ResponseHeaders });


                if (UploadValuesCompleted != null)
                {
                    UploadValuesCompleted(null, (UploadValuesCompletedEventArgs)(object)e);
                }
                #endregion
            }
                );

            x.responseType = "arraybuffer";


            //Console.WriteLine("WebClient.UploadValuesAsync IXMLHttpRequest " + new { xFormDataString });
            x.send(xFormDataString);
        }