无法运行使用dnx发布的Web应用程序

3

我有一个基于ASP.NET 5 RC1 final预览模板的应用程序。我通过运行以下命令来发布此应用程序:

dnu publish --no-source --runtime active --configuration Release

生成的软件包包含运行时“dnx-clr-win-x64.1.0.0-rc1-final”。

当我将软件包复制到另一台Windows机器并尝试在output\approot目录中运行web命令时,会收到以下错误:

Error: Unable to load application or execute command 'Microsoft.AspNet.Server.WebListener'. Available commands: web, webListener.
System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.
   at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
   at System.Reflection.Assembly.LoadFile(String path)
   at Microsoft.Dnx.Runtime.Loader.LoadContext.LoadFile(String assemblyPath)
   at Microsoft.Dnx.Runtime.Loader.PackageAssemblyLoader.Load(AssemblyName assemblyName, IAssemblyLoadContext loadContext)
   at Microsoft.Dnx.Host.LoaderContainer.Load(AssemblyName assemblyName)
   at Microsoft.Dnx.Runtime.Loader.AssemblyLoaderCache.GetOrAdd(AssemblyName name, Func`2 factory)
   at Microsoft.Dnx.Runtime.Loader.LoadContext.ResolveAssembly(Object sender, ResolveEventArgs args)
   at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName)

我尝试了Kestrel和WebListener,但出现了相同的错误信息。该程序包在我的电脑上可以运行。

还有其他需要做的事情来使应用程序在另一台计算机上运行吗?


你复制了什么到另一台机器上?是整个 output/bin 文件夹还是其中的一些子文件夹? - Victor Hurdugaci
我复制了整个输出文件夹(包括子文件夹approot、logs和wwwroot),但没有bin子文件夹。 - Martin Klinke
1
请查看此链接:https://dev59.com/nWUp5IYBdhLWcg3wf3oG#15238782 - Kiran
@KiranChalla 谢谢,这似乎解决了问题!您是否愿意创建一个实际的答案,以便我可以接受? - Martin Klinke
可能你复制到的机器上安装的 .net 版本比你现在使用的机器要早。此外,Visual Studio GUI 中应该有一个选择发布到 .net framework 而不是 .net core(目标 DNX Framework)的选项。 - devfric
3个回答

2

自主托管应用程序,我已经:

  • 部署到文件系统(我的开发机器的c驱动器)
  • 在Hosting.ini(C:[app-name] \ approot \ src [app-name] \)中更改了本地主机:5000(默认值)的条目,将其改为我的机器的IP地址
  • 在我的机器的Windows防火墙中打开了端口5000

然后,我能够从另一台机器通过局域网加载应用程序。
请注意,您必须以管理员身份启动web.cmd
这样做后,我在我们的内部网络服务器上完成了同样的操作(将整个部署的目录复制到内部网络服务器的c驱动器上,在hosting.ini中更改IP为服务器IP,并在内部网络服务器的Windows防火墙上打开端口5000)。
然后我以管理员身份在内部网络服务器上启动了web.cmd,应用程序可以通过LAN访问(Server-IP:5000或DNS名称:5000)。
注意:我刚刚升级到RC1,项目模板似乎有各种变化(因此,我重新创建了我的小型示例项目)。
特别是Hosting.ini文件(我已更改Localhost条目为机器IP)不再生成/支持。
我还没有找到任何描述,如何确切地更改IP(根据微软,在hosting.json文件中),但是发现可以在project.json文件中更改它。
我已经更改了:

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  },

为了

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls=http://172.16.1.7:5000",
    "ef": "EntityFramework.Commands"
  },

现在,它又可以工作了。
但是请注意!
我确定应该以另一种方式完成(根据MS在hosting.json文件中的说明),但是 - 正如我所写的 - 我没有找到任何有关hosting.json文件中条目的描述,但在Internet上找到了一个关于如何在project.json文件中执行此操作的提示。

因此,请将其仅视为临时解决方案,直到我们知道如何正确执行它!
并且只在已部署的目录中进行此操作(不要在VS项目中进行此操作,否则本地开发环境将无法再运行!


可以将--server.urls参数传递给web.cmd。你的方法对我也起作用了。问题出现在通过dnu publish命令在Jenkins中构建的包上。当我有时间时,我会查看Kiran评论中链接的SO答案。 - Martin Klinke
嘿,好帖子! 你在 hosting.json 文件中找到解决方案了吗? - Stoimen Iliev
不,我希望这个问题在最终版本中得到解决(否则我会给微软写一封信)。目前我可以接受这个解决方法。顺便说一下,自托管真的非常好用,而且速度非常快。 - FredyWenger

2

0
作为 @martin klinke 建议的 7-zip 的替代方案,您可以使用 sysinternals / technet 的 streams -s -d *.* 命令。
这将解锁标记为“不安全”的文件(请参见 Martin 提供的 link)。
这将递归地解除文件阻止(在曾经是您的 zip 文件的根目录中运行它)。

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