在smarterasp.net上发布包含csc.exe文件的网站遇到问题?

53

我正在使用Microsoft Visual Studio 2015,用C#创建了一个简单的网站并带有联系表单。

当我在本地主机上编译和运行时,一切都很正常。然而,当我尝试发布它(在smarterasp.net上)时,我遇到了一个错误:

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

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

我已经联系了smarterasp.net,他们表示不允许.exe文件。我试图通过ftp从服务器中删除csc.exe,但这样做会出现以下错误:

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

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


你发布到主机上的是什么?是哪种类型的文件?你使用了哪种类型的VS项目?你是如何进行发布的?通常情况下,你不会将csc发送到你的Web服务器。 - Niels V
这是一个包含HTML、CSS、JS、CSHTML、C#等内容的MVC项目。我使用Visual Studio中的Web Deploy进行发布。 - Ahron M. Galitzky
嗯...他们允许.exe文件吗?这很重要。如果他们允许,你只需要请求他们给予权限。你的应用程序应该可以正常工作。 - user1229931
只需将/bin文件夹的权限更改为读写即可。感谢GuChil提供的答案。 - Miguel
14个回答

98
经过数小时的研究,我找到了解决方案。
自 .NET 4.5 版本以来,Roslyn 编译是默认的编译方式。这意味着,如果您使用 .NET 4.5 创建任何 Web 应用程序(Web Forms 或 MVC),则会预先安装此 Roslyn csc.exe 编译器。
基本上,我需要的是在没有 Roslyn 或任何 .exe 文件的情况下编译和部署我的项目。
因此,以下是对我有效的解决方案。您可以在不更改代码的情况下无需使用 Roslyn 进行部署:
  1. 打开 NuGet 包管理器窗口
  2. 卸载 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 包并重新构建和发布。(此卸载还从 web.config 文件中删除 CodeDom 配置。)
这将解决您的目的。基本上,这不会在 bin 文件夹中生成任何 csc.exe、vbc.exe 文件。
希望对您也有用!

1
在您的控制面板中,有一个名为“安全管理器”的选项,可以选择“允许.EXE文件”。这至少可以解决上传问题。 - aethercowboy
1
@aethercowboy 我尝试了允许exe文件的选项,但它没有起作用。我仍然收到“无法执行程序”的异常。在目录上设置写权限和信任级别为完全可能也可以解决问题。但是删除Roslyn编译器似乎更简单,并且它起作用了!非常感谢! - CaptainStealthy
3
完成此操作后,您将无法在 Razor (.cshtml) 文件中使用 C# 6.0 语言特性。 - Rudey
1
我认为@Eris在下面给出了“正确”的答案。它不仅隐藏了症状,而且解决了问题。 - Mike Devenney
太棒了!谢谢你。 - Hugo Nava Kopp
显示剩余4条评论

20

我在Smarter ASP上遇到了这个问题。在控制面板的浏览器文件管理器中,导航到bin文件夹中的“Roslyn”文件夹,并将.net权限设置为读写。然后它就可以工作了。


17

如果你想保留Roslyn代码生成,你只需要将应用程序的bin文件夹的权限设置为允许ApplicationPool用户读取和执行。

我使用资源管理器中的“安全”选项卡在文件夹属性对话框中完成了这个操作,但你也可以尝试其他方法:

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

我需要在项目站点上授予IIS_IUSRS读取权限,在bin文件夹上授予读取和执行权限。(我只是在整个项目站点上给了它读取和执行权限,但那只适用于本地使用。)谢谢! - markau
2
这应该被标记为正确答案。它解决了问题的根源,而不仅仅是隐藏症状。 - Mike Devenney

13

我发现解决方法是在发布窗口中取消勾选 "允许预编译站点更新"。 在此输入图片描述


1
如果您的ASP.NET网站依赖于App_Code文件夹,则此方法将无法正常工作。有关更多信息,请参见此线程 - Rudey
取消勾选“允许预编译站点”选项最终解决了我的问题。谢谢! - Scott Marlowe
这仅适用于网站,而不适用于Web应用程序。 - Anytoe
谢谢。这对我来说非常完美。我需要DotNetCompilerPlatform,因为C# 6(Null-conditional Operators),但我正在使用Godaddy共享主机:( - Marin Popov

12

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


12

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

详情请参见此图片


它确实可以工作。但是您必须购买.NET高级托管计划才能运行“*.exe”文件,例如“csc.exe”(Roslyn)。 - AlexMelw
1
我的当前计划是“高级计划”,它很有效。之前的计划是基础版,下一个是高端版,所以我目前无法确认您的观点。 - GuChil
你说得完全正确。我注意到每个托管计划(包括免费的)都支持完全信任。嗯,这只是一个文件权限问题。谢谢! - AlexMelw

11

在使用VS2015通过Web Deploy发布ASP.net 4.5.2 SPA时,遇到了与原帖相同的问题。

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

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


谢谢,兄弟干得好! - Hugo Nava Kopp
如果我这样做,那么发生的事情就是构建无法工作,并且会给我大量的错误消息,例如:error CS0103: The name 'nameof' does not exist in the current context - Colin Mackay

1
这是我让它工作的方法:

  1. In your control panel, navigate to Security Manager > Allow .EXE Files
  2. Set the value to On (this will let you upload .exe files)
  3. In your Web.config, set full trust (this will let you run them)

    <configuration> 
      <system.web> 
        <trust level="Full" /> 
      </system.web> 
    </configuration> 
    
  4. In your publish settings, enable "Precompile during publishing", but in the Advanced Precompile Settings (the Configure link next to this option), disable "Allow precompiled site to be updateable".


这个解决方案看起来还不错,但是我在发布后应该关闭exe上传吗?因为这可能会存在安全问题。 - UmarKashmiri

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

enter image description here

在我的情况下,我必须这样做是因为我想托管一个Asp.Net Core网站,这绝对需要一个.exe文件 :-)


1

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


2
至少给我们一个提示如何做到这一点。 - Tarek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接