在 smarterasp.net 上发布包含 csc.exe 文件的网站时出现问题?

Posted

技术标签:

【中文标题】在 smarterasp.net 上发布包含 csc.exe 文件的网站时出现问题?【英文标题】:Problems publishing a website on smarterasp.net with csc.exe file included? 【发布时间】:2016-05-13 02:03:16 【问题描述】:

我正在使用 Microsoft Visual Studio 2015,我使用 C# 联系表单构建了一个简单的网站。 当我在 localhost 上编译和运行时,它工作得很好。但是,当我尝试发布它(在 smarterasp.net 上)时,我收到了一个错误:

[Win32Exception (0x80004005): 访问被拒绝]

[ExternalException (0x80004005): 无法执行程序。正在执行的命令是“..\bin\roslyn\csc.exe”

我已联系 smarterasp.net,他们说他们不允许 .exe 文件。我尝试使用 ftp 从服务器中删除 csc.exe,但是当我这样做时,我收到了错误:

找不到文件“..\bin\roslyn\csc.exe”。

我如何使用试图包含在我的项目中的 csc.exe 来解决这个问题,以便我可以发布我的这个网站?

【问题讨论】:

你向你的主机发布什么?什么样的文件?你使用了什么样的 VS 项目?你是怎么发布的?您通常不会将 csc 发送到您的网络服务器。 这是一个包含html,css,js,cshtml,c#的MVC项目。等等。我使用 Visual Studio 中的 Wed Deploy 发布了它。 嗯.... 他们允许 .exe 文件吗?这个很重要。如果他们允许,您只需要让他们为您提供许可。您的应用程序应该可以正常工作。 只需将 /bin 文件夹的权限更改为读写。谢谢,GuChil 的回答。 【参考方案1】:

经过数小时的研究,我想出了解决方案。

从.NET 4.5版本开始,Roslyn编译是默认的编译方式。这意味着,如果您使用 .NET 4.5 创建任何 Web 应用程序,无论是 Web 窗体还是 MVC,您都会在项目中预安装此 Roslyn csc.exe 编译。

基本上我需要的是在没有 Roslyn 或任何 .exe 文件的情况下编译和部署我的项目。

所以这是对我有用的解决方案。您可以在没有 Roslyn 的情况下进行部署,而无需更改代码:

    打开 NuGet 包管理器窗口 卸载 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 包并重新构建和重新发布。 (此卸载还会从 web.config 文件中删除 CodeDom 配置。)

这将解决您的目的。基本上这不会在 bin 文件夹内生成任何 csc.exe、vbc.exe 文件。

我希望它也对你有用!

【讨论】:

在您的控制面板中,“安全管理器”下有一个“允许 .EXE 文件”选项。这至少解决了上传问题。 酷!我正在和他们聊天,他们说他们不支持 .EXE 文件。我猜他们不知道他们支持什么。 @aethercowboy 我尝试了允许 exe 文件的选项,但它不起作用。我仍然得到“无法执行程序”异常。将目录的写入权限和信任级别设置为完全可能也已修复它。但是删除 Roslyn 编译器似乎要简单得多,而且有效!!非常感谢! 执行此操作后,您将无法再在 Razor (.cshtml) 文件中使用 C# 6.0 语言功能... 我认为@Eris 在下面有“正确”的答案。它不仅隐藏了症状,而且解决了问题。【参考方案2】:

我在 Smarter ASP 上遇到过这个问题。在控制面板的浏览器文件管理器中,导航到 bin 中的“Roslyn”文件夹并将 .net 权限设置为读/写。那时它起作用了。

【讨论】:

【参考方案3】:

如果你真的想保留 roslyn codegen,你只需要设置应用程序的 bin 文件夹的权限,允许 ApplicationPool 用户读取和执行。

我使用文件夹属性对话框上的资源管理器安全选项卡执行此操作,但您也应该能够执行以下操作:

icacls PATH_TO_SERVICE_BIN /grant "ApplicationPoolUser":(OI)(CI)RX

【讨论】:

我需要在项目站点上授予 IIS_IUSRS 读取权限,在 bin 上授予读取和执行权限。 (我只是在整个项目站点上给它 Read & Execute,但这仅供本地使用。)谢谢! 这应该被标记为正确答案。这从根本上解决了问题,而不仅仅是隐藏症状。【参考方案4】:

我发现解决方案是在发布窗口中取消选中“允许预编译的站点可更新”。

【讨论】:

如果您的 ASP.NET 站点依赖于 App_Code 文件夹,这将不起作用。请参阅this thread 了解更多信息。 取消选中“允许预编译站点”框最终为我做了。谢谢! 这仅适用于网站,不适用于 Web 应用程序 谢谢。它对我来说很完美。由于 C# 6(空条件运算符),我需要 DotNetCompilerPlatform,但我使用的是 Godaddy 共享主机 :(【参考方案5】:

只需从 Web.config 中删除 codedom 部分,即可解决问题。

【讨论】:

【参考方案6】:

只需在 Smarterasp.net 文件管理器中为/bin 文件夹设置 rw 访问权限,如下所示,重新启动您的应用程序

【讨论】:

确实有效。但是您必须购买 .NET Premium 托管计划才能运行“*.exe”文件,例如“csc.exe”(Roslyn)。 我目前的计划是“提前计划”,它有效。上一个计划是基本,下一个是高级,所以目前我无法确认您的观点 你是绝对正确的。我注意到每个hosting plan(也免费)都支持完全信任。好吧,这只是一个文件权限问题。谢谢!【参考方案7】:

在 VS2015 中通过 Web 部署发布 ASP.net 4.5.2 SPA 时遇到了与 OP 相同的问题。

我发现可行的解决方案是删除 Nuget 包 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform"

您也可以直接从 Web.config 文件中删除 system.codedom 编译器配置 部分,这将产生相同的效果。

【讨论】:

谢谢,好兄弟! 如果我这样做,所发生的只是构建将无法工作,并且它会给我大量错误消息,例如:error CS0103: The name 'nameof' does not exist in the current context【参考方案8】:

这是我的工作原理:

    在您的控制面板中,导航至安全管理器 > 允许 .EXE 文件 将值设置为 On(这将允许您上传 .exe 文件)

    在您的Web.config 中,设置完全信任(这将让您运行它们)

    <configuration> 
      <system.web> 
        <trust level="Full" /> 
      </system.web> 
    </configuration> 
    

    在您的发布设置中,启用“发布期间预编译”,但在 高级预编译设置(此选项旁边的配置链接),禁用“允许预编译站点可更新”。

【讨论】:

这个解决方案看起来不错,但是我应该在发布后关闭 exe 上传吗?因为这可能是一个安全问题?【参考方案9】:

我遇到了同样的错误,我通过启用托管目录的权限(读/写/删除)解决了它。

【讨论】:

至少给我们一个提示。【参考方案10】:

如果您需要 SmarterAsp.Net 允许上传 .exe 文件以支持您网站的特性和功能,您可以。只需转到控制面板并打开“允许 .Exe 文件”请参见下文:

就我而言,我必须这样做,因为我想托管一个 Asp.Net Core 网站,而这绝对需要一个 .exe 文件 :-)

【讨论】:

【参考方案11】:

tl;dr:确保 csc.exe 的大小不是零字节。


更长的答案

添加另一个原因和解决方案:在我的情况下,我的浏览器中出现了这个黄屏死机:

“/”应用程序中的服务器错误。

编译错误

描述:编译资源时出错 需要为该请求提供服务。请查看以下具体内容 错误详细信息并适当地修改您的源代码。

编译器错误消息:编译器失败,错误代码为 255。

c:\windows\system32\inetsrv>C:\inetpub\wwwroot\bin\roslyn\csc.exe /t:库 /utf8output /nostdlib+ ...

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.7.2558.0

经过调查,我通过在 CMD 窗口中执行 csc.exe 来隔离对 csc.exe 的调用:

c:\inetpub\wwwroot\bin\roslyn\csc.exe

我收到了这个消息框:

在 CMD 窗口中跟随这一行:

访问被拒绝。

在 Windows 文件资源管理器中检查文件后,我发现 csc.exe 的大小为零字节。

我不确定这发生在我的部署脚本的哪个阶段,但是在将 0 字节大小的 csc.exe 替换为实际工作的 csc.exe 后,一切正常。

【讨论】:

【参考方案12】:

上述解决方案对我不起作用并且不正确,因为这些天 roslyn 不是可选的。

有效的是确保池帐户对网络应用程序的根文件夹具有读取和执行权限。您可以找到授予此权限的帐户,方法是找到您的网络应用使用的池名称,然后找到应用程序池 -> 池名称 -> 高级设置 -> 身份。

我的 VPS 主机使用非标准目录进行托管,如下所示:

c:\home\web.app.name\wwwroot

web.app.name 文件夹需要权限。

【讨论】:

【参考方案13】:

将 nuget 包 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 更新到最新版本(当时)2.0.1 为我解决了这个问题,而无需授予文件夹权限或删除编译器。

【讨论】:

【参考方案14】:

由于第 3 方应用程序,我们遇到了这个问题。 MalwareBytes Anti-Ransomeware 实际上是阻止访问的罪魁祸首。解决了这个问题:

MalwareBytes Anti-Ransomeware(非反利用)的右键单击系统托盘图标 停止保护

【讨论】:

以上是关于在 smarterasp.net 上发布包含 csc.exe 文件的网站时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

Braintree嵌入式贝宝结帐

Docker 在 VS 中运行,但在发布到 AWS 时出错?错误 CS5001:程序不包含适用于入口点的静态“Main”方法

Assets\Footsteps.cs(5,20):错误 CS0116:命名空间不能直接包含字段或方法等成员 [重复]

自动将目标文件夹中的所有脚本包含在已运行的脚本中 - CS6

通过递归生成集合 - 语言和字符串(cs/逻辑)

分析失败并出现错误“没有对此项目执行 FxCop 分析,而它包含 cs 文件”