2

我使用 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.<>c_ DisplayClass1d.b _18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>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.WrappedAsyncResult1.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.<>c_ DisplayClass8.b _3(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.<>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 结果) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970141 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& 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.
 }

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

4

2 回答 2

5

托管时的 MVC 错误通常意味着 MVC 未安装在服务器上,因此无法加载所需的 DLL 之一。

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

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

编辑

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

于 2013-04-10T20:08:45.803 回答
2

当您有一个网站项目并且您的计算机上一切正常并且托管网站上有些事情不正确时,因此我建议您执行以下工作:

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

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

    • 对于这项工作,您可以将项目中每个引用的“复制到本地”属性设置为“真”。例如,对于 MVC 项目,您可以遵循此指南页面:“部署 ASP.NET MVC 应用程序”

    • 找到引用文件的所有依赖,复制到宿主机的bin文件夹中(可以使用VS的Add Deployable Dependencies特性)

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

  • 再次检查项目以更改本地地址并将其转换为相对地址(e:\a\b\website\images\1.jpg... =to=> images\1.jpg 或 http://localhost/images/ 1.jpg =to=> 图像/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.
}
于 2013-04-10T21:48:09.070 回答