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); } } ); }
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); }
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); }