0

我有一个想要添加视图处理的 web api 2.0 应用程序。

我正在使用 postal.mvc5 并希望从应用程序中发送电子邮件。

我已经解决了常规控制器路由问题,现在要解决最后一个错误。

使用 Postal.Mvc5 实现的 _ViewStart.cshtml 页面是:

@{ 
     Layout = null;
 }

我的视图文件夹中的 web.config 页面:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Optimization"/>
        <add namespace="Postal" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
</configuration>

我得到的错误是:

类型“ASP._Page_Views_Emails__ViewStart_cshtml”不继承自“System.Web.WebPages.StartPage”。

完整的错误是:

来源:System.Web ----目标站点:CheckAssignableType 时间戳:2017 年 10 月 23 日下午 3:05:48 消息:类型“ASP._Page_Views_Emails__ViewStart_cshtml”不继承自“System.Web.WebPages.StartPage”。----StackTrace:在 System.Web.UI.Util.CheckAssignableType(Type baseType, Type type) 在 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) 在 System.Web .Compilation.BuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) at System.Web.WebPages.BuildManagerWrapper.CreateInstanceOfType[T](String virtualPath) at System.Web.WebPages.VirtualPathFactoryExtensions.CreateInstance[T](IVirtualPathFactory factory, String virtualPath)在 System.Web.WebPages.VirtualPathFactoryManager。1 supportedExtensions) at System.Web.WebPages.StartPage.GetStartPage(WebPageRenderingBase page, String fileName, IEnumerable1 supportExtensions) at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) at Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder) at Postal.EmailViewRenderer.Render(Email email, String viewName) at Postal.EmailService.CreateMailMessage(Email email) at Postal.EmailService.Send(Email email) at Postal.Email.Send()

我知道这是非常规的,但是我该如何解决最后一个错误呢?

进一步调试更新:

我在 Web 服务上使用 Enterprise Logging,并注意到它直到下一次调用才发送错误电子邮件,因此直到下一次调用 Web 服务时才发送我的错误电子邮件。我使用 smtp 设置在主 web.config 文件中添加了一个 system.net 部分,这实际上使情况变得更糟。Web 服务运行时没有发送电子邮件。

我尝试在 web api 的 global.asax 文件中实例化一个常规的 web 应用程序实例,但这似乎没有真正的效果。

我已经根据下面的答案向 web.config 文件添加了一些路由,但这也没有效果。wep api 2 应用程序具有与常规 Web 应用程序相同的引用和其他配置项,但仍然存在问题。

一种解决方案是将 web api 2 重新创建为添加了 web api 2 的常规网站。网上有很多关于这方面的参考资料,web api 2 应用程序的原始应用程序是一个具有 api 功能的常规网站。

从阅读文献来看,我正在处理的这个对偶问题可能已经用 .Net Core 解决了,但我不能在我们当前的系统上使用它。

我想下一个问题是为什么在 web api 2 运行时 sendmail 被禁用。

web api 2 会在 web api 调用期间禁用 sendmail 怎么样?

4

1 回答 1

1

我终于解决了问题。这是 Postal 使用的 Emails 文件夹中的 web.config 文件的问题。

通常,当您实例化 Web 应用程序时,web.config 文件包含正确的信息,因此 views 文件夹的 web.config 文件继承了必要的类型。

从 web api 2 应用程序开始时,这些类型未在层次结构中定义,因此不会由视图文件夹自动继承。

Views/Emails 文件夹的 web.config 被修改为:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor"
  type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host"
    type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    requirePermission="false"/>
      <section name="pages"
    type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Optimization"/>
        <add namespace="Postal" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
  <appSettings>
    <add key="webpages:Enabled" value="false"/>
 </appSettings>
</configuration>

然后系统路由到视图并按预期处理电子邮件。

上面提到的电子邮件通过的问题是由于电子邮件发送界面在发送过程中爆炸造成的。这并不是由 web api 2 引起的真正问题。

于 2017-10-25T16:26:56.120 回答