错误RZ3007:目标标记名称不能为null或空格。 Razor在发布时会引发错误,但可以在本地工作

时间:2019-04-16 08:11:07

标签: c# .net asp.net-mvc asp.net-core razor

正在努力处理此错误消息一段时间。一个奇怪的方面是,当我在计算机上的Visual Studio中运行该应用程序时,不会发生这种情况,但是当我在服务器上发布该应用程序时,就会发生这种情况。

我遵循了本教程https://long2know.com/2017/08/rendering-and-emailing-embedded-razor-views-with-net-core/

主要Web应用程序项目的软件包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DocumentationFile>SalesPortals.Services.WebHost.xml</DocumentationFile>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
    <NoWarn>1701;1702;CS1591</NoWarn>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="AutoMapper" Version="8.0.0" />
    <PackageReference Include="DinkToPdf" Version="1.0.8" />
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.6.1" />
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.1" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
  </ItemGroup>

用于编译模板的项目的软件包:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.1" />
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.1.1" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="Templates\**\*.cshtml">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </EmbeddedResource>
  </ItemGroup>

</Project>

我有这个html:

@using Templates_v1 = SalesPortals.Services.Templating.Models.v1

@model SalesPortals.Services.Templating.Models.v1.HelloWorldTemplateModel

<h1>Hello World Template</h1>

<h4>
The greatest template that ever lived
</h4>

<p>
    <strong>Hello </strong>@Model.Hello
</p>

渲染发生在这里:

  public class ViewRenderer : IViewRenderer
    {
        /// <summary>
        /// From https://long2know.com/2017/08/rendering-and-emailing-embedded-razor-views-with-net-core/
        /// </summary>
        private readonly IRazorViewEngine _viewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;

        public ViewRenderer(
            IRazorViewEngine viewEngine,
            ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider)
        {
            _viewEngine = viewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;
        }

        public async Task<string> RenderToStringAsync<TModel>(string viewName, TModel model)
        {
            var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            using (var sw = new StringWriter())
            {
                var viewResult = _viewEngine.GetView("~/", viewName, false);

                if (!viewResult.Success)
                {
                    throw new TemplatingException($"Failed to render template {viewName} because it was not found.");
                }

                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = model
                };

                try
                {
                    var viewContext = new ViewContext(
                         actionContext,
                         viewResult.View,
                         viewDictionary,
                         new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                         sw,
                         new HtmlHelperOptions()
                     );

                    await viewResult.View.RenderAsync(viewContext);
                }
                catch (Exception ex)
                {
                    throw new TemplatingException("Failed to render template due to a razor engine failure", ex);
                }
;
                return sw.ToString();
            }
        }

        public Task<string> RenderToStringAsync(string viewName)
        {
            return RenderToStringAsync(viewName, string.Empty);
        }
    }

完整的错误消息

 at Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(String relativePath)
   at Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.OnCacheMiss(String normalizedPath)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(String relativePath)
   at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet`1 expirationTokens, String relativePath, Boolean isMainPage)
   at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromPath(String executingFilePath, String pagePath, Boolean isMainPage)
   at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.GetView(String executingFilePath, String viewPath, Boolean isMainPage)
   at SalesPortals.Services.Templating.ViewRenderer.RenderToStringAsync[TModel](String viewName, TModel model) in E:\BuildAgent\work\be7b69c779fa7cc0\src\SalesPortals.Services.Templating\ViewRenderer.cs:line 44
   at SalesPortals.Services.BusinessLogic.TemplateFacade.CreatePdf(String templateName, ITemplateModel request) in E:\BuildAgent\work\be7b69c779fa7cc0\src\SalesPortals.Services.BusinessLogic\TemplateFacade.cs:line 37
   at SalesPortals.Services.WebHost.Controllers.TemplateController.HelloWorldPdfAsync(HelloWorldTemplateModel request) in E:\BuildAgent\work\be7b69c779fa7cc0\src\SalesPortals.Services.WebHost\Controllers\TemplateController.cs:line 34
   at lambda_method(Closure , Object )
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

1 个答案:

答案 0 :(得分:1)

事实证明这很容易

 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DocumentationFile>SalesPortals.Services.WebHost.xml</DocumentationFile>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
    <NoWarn>1701;1702;CS1591</NoWarn>
  </PropertyGroup>

应该是

  <PropertyGroup>
    <DocumentationFile>SalesPortals.Services.WebHost.xml</DocumentationFile>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
    <NoWarn>1701;1702;CS1591</NoWarn>
  </PropertyGroup>