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

C# 在smarterasp.net上发布包含csc.exe文件的网站时出现问题?,c#,asp.net,visual-studio-2015,C#,Asp.net,Visual Studio 2015,我正在使用Microsoft Visual Studio 2015,我创建了一个带有C#联系人表单的简单网站。 当我在localhost上编译和运行时,它工作得非常好。但是,当我尝试发布它(在smarterasp.net上)时,我得到了一个错误: [Win32Exception(0x80004005):访问被拒绝] [ExternalException(0x80004005):无法执行程序。正在执行的命令为“.\bin\roslyn\csc.exe” 我已联系smarterasp.net,他们说

我正在使用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解决这个问题,它正试图包含在我的项目中,这样我就可以发布我的网站了?

经过几个小时的研究,我找到了解决方案

自.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文件


    我希望它也适用于您!

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

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

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

    下面是我如何让它工作的:

  • 在控制面板中,导航到安全管理器>允许.EXE文件
  • 将该值设置为On(这将允许您上载.exe文件)
  • Web.config
    中,设置完全信任(这将允许您运行它们)

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


  • 我发现这个解决方案在发布窗口中没有选中“允许预编译的站点可更新”。

    只需从Web.config中删除codedom部分,这就解决了问题。

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

    我发现有效的解决方案是删除Nuget包“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”


    或者,您也可以从Web.config文件中删除system.codedom compiler config部分,这也会产生同样的影响。

    我在Smarter ASP上遇到过这个问题。在控制面板的浏览器文件管理器上,导航到bin中的“Roslyn”文件夹,并设置.net读/写权限。它我也遇到了同样的错误,我通过启用托管目录的权限(读/写/删除)解决了这个问题。

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


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

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


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


    更长的答案

    再加上另一个原因和解决方案:在我的情况下,我在浏览器中看到了死亡的黄色屏幕:

    “/”应用程序中出现服务器错误

    编译错误

    描述:编译资源时出错 服务此请求所必需的。请查看以下具体内容 错误详细信息,并适当修改源代码

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

    c:\windows\system32\inetsrv>c:\inetpub\wwwroot\bin\roslyn\csc.exe /t:library/utf8output/nostlib+

    版本信息: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窗口中紧跟这一行:

    c:\inetpub\wwwroot\bin\roslyn\csc.exe
    
    访问被拒绝

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


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

    上述解决方案对我不起作用,也不正确,因为roslyn现在不是可选的

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

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

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


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

    更新nuget软件包
    Microsoft.CodeDom.Provider