예제 #1
0
        protected IAsyncResult BeginInvoke(string methodName, string requestUrl, object[] parameters, AsyncCallback callback, object asyncState)
        {
            HttpSimpleMethodStubInfo   method = (HttpSimpleMethodStubInfo)TypeStub.GetMethod(methodName);
            SimpleWebClientAsyncResult ainfo  = null;

            try
            {
                MimeParameterWriter parameterWriter = (MimeParameterWriter)method.ParameterWriterType.Create();
                string     url = parameterWriter.GetRequestUrl(requestUrl, parameters);
                WebRequest req = GetWebRequest(new Uri(url));

                ainfo                 = new SimpleWebClientAsyncResult(req, callback, asyncState);
                ainfo.Parameters      = parameters;
                ainfo.ParameterWriter = parameterWriter;
                ainfo.Method          = method;

                ainfo.Request = req;
                ainfo.Request.BeginGetRequestStream(new AsyncCallback(AsyncGetRequestStreamDone), ainfo);
                RegisterMapping(asyncState, ainfo);
            }
            catch (Exception ex)
            {
                if (ainfo != null)
                {
                    ainfo.SetCompleted(null, ex, false);
                }
                else
                {
                    throw ex;
                }
            }

            return(ainfo);
        }
예제 #2
0
        protected object EndInvoke(IAsyncResult asyncResult)
        {
            if (!(asyncResult is SimpleWebClientAsyncResult))
            {
                throw new ArgumentException("asyncResult is not the return value from BeginInvoke");
            }

            SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult)asyncResult;

            lock (ainfo)
            {
                if (!ainfo.IsCompleted)
                {
                    ainfo.WaitForComplete();
                }

                UnregisterMapping(ainfo.AsyncState);

                if (ainfo.Exception != null)
                {
                    throw ainfo.Exception;
                }
                else
                {
                    return(ainfo.Result);
                }
            }
        }
예제 #3
0
        void AsyncGetResponseDone(IAsyncResult ar)
        {
            SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult)ar.AsyncState;
            WebResponse response             = null;

            try {
                response = GetWebResponse(ainfo.Request, ar);
            }
            catch (WebException ex) {
                response = ex.Response;
                HttpWebResponse http_response = response as HttpWebResponse;
                if (http_response == null || http_response.StatusCode != HttpStatusCode.InternalServerError)
                {
                    ainfo.SetCompleted(null, ex, true);
                    return;
                }
            }
            catch (Exception ex) {
                ainfo.SetCompleted(null, ex, true);
                return;
            }

            try {
                MimeReturnReader returnReader = (MimeReturnReader)ainfo.Method.ReturnReaderType.Create();
                object           result       = returnReader.Read(response, response.GetResponseStream());
                ainfo.SetCompleted(result, null, true);
            }
            catch (Exception ex) {
                ainfo.SetCompleted(null, ex, true);
            }
        }
예제 #4
0
		protected IAsyncResult BeginInvoke (string methodName, string requestUrl, object[] parameters, AsyncCallback callback, object asyncState)
		{
			HttpSimpleMethodStubInfo method = (HttpSimpleMethodStubInfo) TypeStub.GetMethod (methodName);
			SimpleWebClientAsyncResult ainfo = null;
			
			try
			{
				MimeParameterWriter parameterWriter = (MimeParameterWriter) method.ParameterWriterType.Create ();
				string url = parameterWriter.GetRequestUrl (requestUrl, parameters);
				WebRequest req = GetWebRequest (new Uri(url));
				
				ainfo = new SimpleWebClientAsyncResult (req, callback, asyncState);
				ainfo.Parameters = parameters;
				ainfo.ParameterWriter = parameterWriter;
				ainfo.Method = method;
				
				ainfo.Request = req;
				ainfo.Request.BeginGetRequestStream (new AsyncCallback (AsyncGetRequestStreamDone), ainfo);
				RegisterMapping (asyncState, ainfo);
			}
			catch (Exception ex)
			{
				if (ainfo != null)
					ainfo.SetCompleted (null, ex, false);
				else
					throw ex;
			}

			return ainfo;

		}
예제 #5
0
        void InvokeAsyncCallback(IAsyncResult ar)
        {
            InvokeAsyncInfo            info = (InvokeAsyncInfo)ar.AsyncState;
            SimpleWebClientAsyncResult sar  = (SimpleWebClientAsyncResult)ar;
            InvokeCompletedEventArgs   args = new InvokeCompletedEventArgs(sar.Exception, false, info.UserState, (object[])sar.Result);

            if (info.Context != null)
            {
                info.Context.Send(info.Callback, args);
            }
            else
            {
                info.Callback(args);
            }
        }
예제 #6
0
        void AsyncGetRequestStreamDone(IAsyncResult ar)
        {
            SimpleWebClientAsyncResult ainfo = (SimpleWebClientAsyncResult)ar.AsyncState;

            try
            {
                if (ainfo.ParameterWriter.UsesWriteRequest)
                {
                    Stream stream = ainfo.Request.GetRequestStream();
                    ainfo.ParameterWriter.WriteRequest(stream, ainfo.Parameters);
                    stream.Close();
                }

                ainfo.Request.BeginGetResponse(new AsyncCallback(AsyncGetResponseDone), ainfo);
            }
            catch (Exception ex)
            {
                ainfo.SetCompleted(null, ex, true);
            }
        }