【问题标题】:ashx handlers use older C# compilerashx 处理程序使用较旧的 C# 编译器
【发布时间】:2017-01-19 22:15:11
【问题描述】:

我有一个旧的解决方案,不久前已升级到 C# 6,我们在大部分代码中都在使用它。由于它的年代久远,它有各种各样的项目类型,从老式的 asp.net 一直到 web api 2。然而,由于某种原因,传统 asp.net 项目中的 ashx 文件仍然以 C# 5 为目标,因此我们不能在那里使用一些较新的语言功能(请注意,C# 代码是在 ashx 文件中内联定义的,没有单独的 ashx.cs 文件)。如何升级 ashx 文件的编译器?后续问题 - 我如何让它继承解决方案其余部分使用的编译器版本?

【问题讨论】:

  • 为什么不升级项目的.NET版本?
  • 已经在 4.5.1,实际上 C# 6 在项目的其他地方使用 - 实际上只是 ashx 文件在抱怨
  • 它抱怨什么?奇怪...但是您可以在不使用 ashx 的情况下重写处理程序,例如:public class SyncHandler : IHttpHandler。然后在 web.config 中注册它。都是一样的。
  • 红色波浪线,这个功能在 C# 5 中是不可用的。那种东西。
  • 这就是你的想法,但我可以附上截图证明相反;-)

标签: asp.net ashx


【解决方案1】:

首先,要知道标记中包含的代码(如 .aspx 或 .ashx)的编译方式与代码隐藏不同。您的代码隐藏被编译成一个 DLL,该 DLL 被部署到您的 bin 文件夹中。同时,除非您费心预编译 .ashx 和 .aspx 文件,否则它们是即时编译的。您实际上可以直接在 Web 服务器上修改标记,并且更改将触发重新编译。

其次,请记住 .ashx 编译发生了巨大变化。过去它的编译是由<BuildProviders> element 控制的,它通常配置为System.Web.Compilation.WebHandlerCompilationProvider。但是,在 2.0 和 4.5 之间的某个位置,它已被弃用,而支持使用 <Compilers> element 的不同类型的配置。后者可以配置为指定语言版本,例如

<system.codedom>
 <compilers>
   <!-- zero or more compiler elements -->
   <compiler 
      language="c#;cs;csharp" 
      extension=".cs"
      type="Microsoft.CSharp.CSharpCodeProvider, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      compilerOptions=""  
      warningLevel="1" />
 </compilers>
</system.codedom>

我认为您的(非常旧的)代码库配置不正确;可能是它使用了旧的配置方式,或者版本标识符错误。

我的建议是将 .ashx 标记移动到适当的 .cs 文件中,并在构建期间将其与所有其他代码一起编译。这将完全避免这个问题。否则,您将需要仔细检查您机器的配置(这些配置不一定在您的 web.config 中)并将它们全部对齐。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多