/*
         * Process one ISAPI request
         *
         * @param ecb ECB
         * @param useProcessModel flag set to true when out-of-process
         */
        /// <include file='doc\ISAPIRuntime.uex' path='docs/doc[@for="ISAPIRuntime.ProcessRequest"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public int ProcessRequest(IntPtr ecb, int iWRType)
        {
            HttpWorkerRequest wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, iWRType);
//              switch (iWRType) {
//                  case 2:
//                      wr = new IEWorkerRequest(ecb);
//                      break;
//                  default:
//                      wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, iWRType);
//              break;
//              }

            // check if app path matches (need to restart app domain?)

            String wrPath = wr.GetAppPathTranslated();
            String adPath = HttpRuntime.AppDomainAppPathInternal;


            if (adPath == null || wrPath.Equals(".") ||  // for xsptool it is '.'
                String.Compare(wrPath, adPath, true, CultureInfo.InvariantCulture) == 0)
            {
                HttpRuntime.ProcessRequest(wr);
                return(0);
            }
            else
            {
                // need to restart app domain
                HttpRuntime.ShutdownAppDomain("Physical application path changed from " + adPath + " to " + wrPath);
                return(1);
            }
        }
        public int ProcessRequest(IntPtr ecb, int iWRType)
        {
            IntPtr zero = IntPtr.Zero;

            if (iWRType == 2)
            {
                zero = ecb;
                ecb  = System.Web.UnsafeNativeMethods.GetEcb(zero);
            }
            ISAPIWorkerRequest wr = null;

            try
            {
                bool useOOP = iWRType == 1;
                wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);
                wr.Initialize();
                string appPathTranslated        = wr.GetAppPathTranslated();
                string appDomainAppPathInternal = HttpRuntime.AppDomainAppPathInternal;
                if ((appDomainAppPathInternal == null) || StringUtil.EqualsIgnoreCase(appPathTranslated, appDomainAppPathInternal))
                {
                    HttpRuntime.ProcessRequestNoDemand(wr);
                    return(0);
                }
                HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplicationPathChanged, System.Web.SR.GetString("Hosting_Phys_Path_Changed", new object[] { appDomainAppPathInternal, appPathTranslated }));
                return(1);
            }
            catch (Exception exception)
            {
                try
                {
                    WebBaseEvent.RaiseRuntimeError(exception, this);
                }
                catch
                {
                }
                if ((wr == null) || !(wr.Ecb == IntPtr.Zero))
                {
                    throw;
                }
                if (zero != IntPtr.Zero)
                {
                    System.Web.UnsafeNativeMethods.SetDoneWithSessionCalled(zero);
                }
                if (exception is ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
                return(0);
            }
        }
Exemple #3
0
        [SecurityPermission(SecurityAction.LinkDemand, Unrestricted = true)] // DevDiv #180492
        public int ProcessRequest(IntPtr ecb, int iWRType)
        {
            IntPtr pHttpCompletion = IntPtr.Zero;

            if (iWRType == WORKER_REQUEST_TYPE_IN_PROC_VERSION_2)
            {
                pHttpCompletion = ecb;
                ecb             = UnsafeNativeMethods.GetEcb(pHttpCompletion);
            }
            ISAPIWorkerRequest wr = null;

            try {
                bool useOOP = (iWRType == WORKER_REQUEST_TYPE_OOP);
                wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);
                wr.Initialize();

                // check if app path matches (need to restart app domain?)
                String wrPath = wr.GetAppPathTranslated();
                String adPath = HttpRuntime.AppDomainAppPathInternal;

                if (adPath == null ||
                    StringUtil.EqualsIgnoreCase(wrPath, adPath))
                {
                    HttpRuntime.ProcessRequestNoDemand(wr);
                    return(0);
                }
                else
                {
                    // need to restart app domain
                    HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplicationPathChanged,
                                                  SR.GetString(SR.Hosting_Phys_Path_Changed,
                                                               adPath,
                                                               wrPath));
                    return(1);
                }
            }
            catch (Exception e) {
                try {
                    WebBaseEvent.RaiseRuntimeError(e, this);
                } catch {}

                // Have we called HSE_REQ_DONE_WITH_SESSION?  If so, don't re-throw.
                if (wr != null && wr.Ecb == IntPtr.Zero)
                {
                    if (pHttpCompletion != IntPtr.Zero)
                    {
                        UnsafeNativeMethods.SetDoneWithSessionCalled(pHttpCompletion);
                    }
                    // if this is a thread abort exception, cancel the abort
                    if (e is ThreadAbortException)
                    {
                        Thread.ResetAbort();
                    }
                    // IMPORTANT: if this thread is being aborted because of an AppDomain.Unload,
                    // the CLR will still throw an AppDomainUnloadedException. The native caller
                    // must special case COR_E_APPDOMAINUNLOADED(0x80131014) and not
                    // call HSE_REQ_DONE_WITH_SESSION more than once.
                    return(0);
                }

                // re-throw if we have not called HSE_REQ_DONE_WITH_SESSION
                throw;
            }
        }