托管后,Web应用程序无法运行

时间:2013-04-10 20:03:03

标签: c# asp.net-mvc-4 hosting

我使用C#和ASP.NET MVC 4(移动模板应用程序)在Visual Studio 2010中创建了一个Web应用程序。 现在,当我通过Visual Studio运行它时它工作正常。但是现在我已经在我的网站上托管了它,我一直收到这个错误:

' / test'中的服务器错误应用

无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Reflection.ReflectionTypeLoadException:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

来源错误:

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

[ReflectionTypeLoadException: Unable to load one or more of the requested types.      Retrieve the LoaderExceptions property for more information.]
System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) +0
System.Reflection.RuntimeModule.GetTypes() +4
System.Reflection.Assembly.GetTypes() +78
System.Data.Entity.ModelConfiguration.Mappers.TypeMapper.<.ctor>b__1(Assembly a) +11
System.Linq.<SelectManyIterator>d__14`2.MoveNext() +238
System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection) +395
System.Data.Entity.ModelConfiguration.Mappers.TypeMapper..ctor(MappingContext mappingContext) +253
System.Data.Entity.DbModelBuilder.MapTypes(EdmModel model) +114
System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo) +112
System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +59
System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +62
System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +117
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +453
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +18
System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +56
System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() +15
System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) +67
System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) +150
System.Data.Entity.DbSet`1.Add(TEntity entity) +42
PrayerTimes.Models.MosqueRepository.AddError(String error) in MosqueRepository.cs:74
PrayerTimes.Controllers.MosqueController.Index() in MosqueController.cs:57
lambda_method(Closure , ControllerBase , Object[] ) +40
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +188
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()+28
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult syncResult) +29
System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +59
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +240
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +31
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +23
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +128
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50

System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)+26     System.Web.Mvc。&lt;&gt; c_ DisplayClass1d.b _18(IAsyncResult asyncResult)+14     System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass4.b _3(IAsyncResult ar)+25     System.Web.Mvc.Async.WrappedAsyncResult 1.End() +55 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +41 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25 System.Web.Mvc.Async.WrappedAsyncResult 1.End()+55     System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)+28     System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)+10     System.Web.Mvc。&lt;&gt; c_ DisplayClass8.b _3(IAsyncResult asyncResult)+28     System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass4.b _3(IAsyncResult ar)+25     System.Web.Mvc.Async.WrappedAsyncResult`1.End()+55     System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+30     System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+9     System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8970141     System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+184

我尝试过在网上搜索解决方案而且我遇到了很多,我已经尝试过,但似乎没有任何效果。其中一个解决方案是使用它:

try
{
 //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
StringBuilder sb = new StringBuilder();
foreach (Exception exSub in ex.LoaderExceptions)
{
    sb.AppendLine(exSub.Message);
    if (exSub is FileNotFoundException)
    {
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
        {
            sb.AppendLine("Fusion Log:");
            sb.AppendLine(exFileNotFound.FusionLog);
        }
    }
    sb.AppendLine();
 }
 string errorMessage = sb.ToString();
 //Display or log the error based on your application.
 }

我在我的数据库中创建了一个错误表,并尝试将上述代码中的错误添加到表中,但这也没有用。可以请帮忙吗?非常感谢

2 个答案:

答案 0 :(得分:5)

托管时经常出现MVC错误意味着服务器上没有安装MVC,因此无法加载其中一个所需的DLL。

您可以通过将所有DLL复制到应用的bin目录来解决此问题。

如果在项目中为MVC内容(System.Web.Mvc,System.Web.Routing等)的引用上将“Copy Local”标志设置为true,它会将它们复制到bin目录中你发布。有一种更简单的方法,但我忘记了捷径。

修改

Here it is - 可部署的依赖项。但是如果评论是准确的,这个功能在VS2010中,但在VS2012中删除了,所以你仍然需要做“复制本地”的事情。

答案 1 :(得分:2)

如果您有一个网站项目,并且您的计算机上的所有内容都正常,并且托管网站上的某些内容不正确,那么我建议您执行以下操作:

  
      
  • 检查项目的.net框架版本与主机上的Web服务器的.net框架版本。他们必须是平等的。

  •   
  • 将项目中的所有引用文件复制到托管网站(本地bin ---到---&gt;托管bin)

         
        
    • 对于此项工作,您可以将项目中每个参考的“复制到本地”属性设置为“TRUE”。例如,对于MVC项目,您可以按照以下指南页面进行操作:"Deploy an ASP.NET MVC Application"

    •   
    • 查找参考文件的所有依赖项并将它们复制到主机上的bin文件夹中(您可以使用VS的添加可部署依赖项功能)

    •   
  •   
  • 检查文件的读写权限&amp;主机上的文件夹(临时文件夹,日志文件夹,上传文件夹和......)

  •   
  • 再次检查项目更改本地地址并将其转换为相对地址(e:\ a \ b \ website \ images \ 1.jpg ... = to =&gt; images \ 1.jpg或http:// localhost / images / 1.jpg = to =&gt; images / 1.jpg)

  •   当您更改某些基本设置(例如.net版本)时,
  • 重新启动主机上的某些服务(例如Web服务器或...)。

  •   
  • 如果您使用的是某些 COM引用,请检查它们是否已安装在具有相同版本的目标计算机上

  •   
     

修改

     
    <system.web>
        <securityPolicy>
              <trustLevel name="Full" policyFile="internal"/>
        </securityPolicy>
    </system.web>

修改 在本期中,您可以使用以下方法测试代码(@BenGripka):

这个错误没有真正的魔术答案。关键是要掌握所有信息以了解问题。很可能动态加载的程序集缺少引用的程序集。该程序集需要位于应用程序的bin目录中。

使用此代码确定缺少的内容。

using System.IO;
using System.Reflection;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        if (exSub is FileNotFoundException)
        {
            FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}