ApplicationHost.CreateApplicationHost: System.IO.FileNotFoundException

I am trying to use CreateApplicationHost to display the contents of an ASP web page. The exact code is as follows:

 public class LocalPageContentAppropriator { private RemoteDomain _host; protected RemoteDomain Host { get { if (_host == null) { _host = (RemoteDomain)ApplicationHost.CreateApplicationHost(typeof(RemoteDomain), "/", SettingsFactory.Instance.WebFileRoot + "\\"); } return _host; } } public string Resolve(string page, string query) { return Host.ProcessRequest(page, query); } } public class RemoteDomain : MarshalByRefObject { public string ProcessRequest(string page, string query) { using (StringWriter sw = new StringWriter()) { SimpleWorkerRequest work = new SimpleWorkerRequest(page, query, sw); HttpRuntime.ProcessRequest(work); return sw.ToString(); } } } 

The path returned for SettingsFactory.Instance.WebFileRoot points to the physical directory of the website. Tried to add "\ bin \" etc., but no matter what I try, I still get the same error, even if I intentionally enter the wrong path.

Now where does it get interesting. Fusion Logging usually returns something like this when the assembly is loaded correctly (under normal use):

 Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable c:\windows\microsoft.net\framework\v4.0.30319\aspnet_wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = WICKEDWE-FFB297\ASPNET LOG: DisplayName = MyWebsite.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified) LOG: Appbase = file:///C:/Projects/Clients/G/MyWebsite/Development/MasterSite/trunk/MyWebsite.Web.Site/ LOG: Initial PrivatePath = C:\Projects\Clients\G\Galderma\Emervel\Development\MasterSite\trunk\MyWebsite.Web.Site\bin LOG: Dynamic Base = C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\3610448a\a3b3a5e7 LOG: Cache Base = NULL LOG: AppName = Umbraco_Sandbox_98a12b84-6e7b-401f-a543-87e17c021ad5 Calling assembly : MyWebsite.Web.Site, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. === LOG: This bind starts in default load context. LOG: Using application configuration file: C:\Projects\Clients\G\Galderma\Emervel\Development\MasterSite\trunk\MyWebsite.Web.Site\web.config LOG: Using host configuration file: c:\windows\microsoft.net\framework\v4.0.30319\aspnet.config LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Binding succeeds. Returns assembly from C:\Projects\Clients\G\Galderma\Emervel\Development\MasterSite\trunk\MyWebsite.Web.Site\bin\MyWebsite.Web.dll. LOG: Assembly is loaded in default load context. 

However, the error shows a different (incorrect) path to Appbase:

 2011-02-08 11:10:03,734 [T1] ERROR MyWebsite.Web.Site.Common.Controls.Forms.Register [L91] - Member registration. System.IO.FileNotFoundException: Could not load file or assembly 'MyWebsite.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. File name: 'MyWebsite.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString) at System.UnitySerializationHolder.GetRealObject(StreamingContext context) at System.Web.Hosting.ApplicationManager.CreateInstanceInNewWorkerAppDomain(Type type, String appId, VirtualPath virtualPath, String physicalPath) at System.Web.Hosting.ApplicationHost.CreateApplicationHost(Type hostType, String virtualDir, String physicalDir) at MyWebsite.Web.LocalPageContentAppropriator.get_Host() in C:\Projects\Clients\G\MyWebsite\Development\MasterSite\trunk\MyWebsite.Web\LocalPageContentAppropriator.cs:line 17 at MyWebsite.Web.LocalPageContentAppropriator.Resolve(String page, String query) in C:\Projects\Clients\G\MyWebsite\Development\MasterSite\trunk\MyWebsite.Web\LocalPageContentAppropriator.cs:line 24 at MyWebsite.Model.ProfessionalMemberLogic.Create(IProfessionalMemberInput input, String completedPagePath, String activationEmailPath, String contextPath) in C:\Projects\Clients\G\MyWebsite\Development\MasterSite\trunk\MyWebsite\Model\ProfessionalMemberLogic.cs:line 66 at MyWebsite.Web.Site.Common.Controls.Forms.Register.btnRegister_Click(Object sender, EventArgs e) in C:\Projects\Clients\G\MyWebsite\Development\MasterSite\trunk\MyWebsite.Web.Site\Common\Controls\Forms\Register.ascx.cs:line 84 Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable c:\windows\microsoft.net\framework\v4.0.30319\aspnet_wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = WICKEDWE-FFB297\ASPNET LOG: DisplayName = MyWebsite.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified) LOG: Appbase = file:///c:/windows/microsoft.net/framework/v4.0.30319/ LOG: Initial PrivatePath = NULL Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: No application configuration file found. LOG: Using host configuration file: c:\windows\microsoft.net\framework\v4.0.30319\aspnet.config LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///c:/windows/microsoft.net/framework/v4.0.30319/MyWebsite.Web.DLL. LOG: Attempting download of new URL file:///c:/windows/microsoft.net/framework/v4.0.30319/MyWebsite.Web/MyWebsite.Web.DLL. LOG: Attempting download of new URL file:///c:/windows/microsoft.net/framework/v4.0.30319/MyWebsite.Web.EXE. LOG: Attempting download of new URL file:///c:/windows/microsoft.net/framework/v4.0.30319/MyWebsite.Web/MyWebsite.Web.EXE. 

Any ideas guys?

+4
source share
2 answers

I'm not right now if you got your answer or not, but I'm trying to do the same and had exactly the same problems.

One, and the simplest, is to place your assembly inside the GAC.

Two, and a bit complicated, is to copy the assembly to the bin directory inside the physicalDir directory, which is used as a parameter to the ApplicationHost.CreateApplicationHost method.

Well explained here: http://www.west-wind.com/Weblog/posts/2613.aspx

+4
source

The ApplicationHost.CreateApplicationHost implementation expects to find the assembly of the specified type in one of two places: either in the global assembly cache (GAC), or in the bin directory in the specified physical directory. There is no documented way to change this behavior before overriding CreateApplicationHost. Therefore, depending on your project and deployment scenario, you may need to install the assembly in one of these places.

Please see here for more details.

Ideally, your host will be in a different assembly (which you deploy under the "bin" of your physical dir server).

0
source

Source: https://habr.com/ru/post/1338834/


All Articles