我是一个处理大型应用程序的团队的一员。我是这个团队的新成员,正在构建一个新的应用程序。作为此过程的一部分,我创建了一个WebApi应用程序,它将公开一些HTTP端点,通过它我将检索有关该应用程序的信息。
由于条件需要花费很长时间才能解释,我想让WebApi项目在另一个目录中构建,特别是..\bin\Server\Debug\
,因为这是应用程序的大多数其他部分构建到。我不打扰,除了应用程序试图使用基于工作目录找到的文件,这对我的WebApi应用程序来说是错误的。
我尝试在项目设置中更改它,现在我收到此错误:
到目前为止,我的谷歌搜索引起了一些帮助。任何人都知道如何解决这个问题?答案 0 :(得分:8)
尝试在配置中添加运行时probing路径:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin\server\Debug;"/>
</assemblyBinding>
</runtime>
</configuration>
除了上述步骤并摆脱globa.asax错误。打开Global.asax文件的标记并在顶部添加跟随行。
<%@ Assembly Name="<you_web_app_assembly_name_here>" %>
现在你将开始收到System.web或BindingProvider未找到的错误等。有一些奇怪的解决方法,它开始在汇编标签下添加程序集。
<compilation debug="true" targetFramework="4.5" optimizeCompilations="false">
<assemblies>
<add assembly="Microsoft.AspNet.Identity.Core, Version=2.2.1, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Optimization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</assemblies>
</compilation>
你会得到更多这样的错误,但这会让你前进。
原因:我看到的问题是,有一个选项可以更改输出路径,但Asp.net会进行即时编译。当您尝试运行网站时,错误与编译相关的原因。某处run time compilation
仅查看\bin
文件夹,这就是我们必须指定项目引用的每个程序集的原因。
更新 -
遗憾的是,您无法更改bin目录。看完所有选项后挖掘发现Asp.net web项目的bin
文件夹不是普通的二进制输出文件夹。它是share code folder,直接在项目中引用二进制文件。
当Web服务器收到Asp.net应用程序的第一个请求时,将编译二进制文件。
bin
文件夹仅用作共享二进制引用文件夹,而不是实际的输出文件夹/目录。On-the-fly
compilation in Asp.net的实际输出文件夹默认设置为%SystemRoot%\Microsoft.NET\Framework\<versionNumber>\Temporary ASP.NET Files
,您可以从compilation
中的[tempDirectory][3]
代码属性web.config
更改课程。
在完成所有这些研究后,我得出结论,由于Asp.net网站项目模板,出现了从project -> properties -> Build -> Bin
更改目录的选项。这为用户提供了与任何其他项目相同的外观。但asp.net网站的功能仍然相同。 Bin
文件夹仍可用于在Asp.net的旧website
模板中使用。
答案 1 :(得分:0)
您可以尝试使用after build目标复制dll。首先将输出路径更改回原来之前更改的路径。然后在项目文件中添加这样的代码。
<target name="AfterBuild">
<copy destinationfolder="..\bin\Server\Debug\" overwritereadonlyfiles="true" sourcefiles="$(OutputPath)\$(AssemblyName).dll" />
<copy destinationfolder="..\bin\Server\Debug\" overwritereadonlyfiles="true" sourcefiles="$(OutputPath)\$(AssemblyName).pdb" />
<copy destinationfolder="..\bin\Server\Debug\" overwritereadonlyfiles="true" sourcefiles="$(OutputPath)\$(AssemblyName).xml" />
</target>
这会将内置的dll放入destinationfolder中指定的文件夹中。我通常将它用于类库但我不明白为什么它不能用于web api项目
如果您愿意,可以查看我的博客文章。
http://torontoprogrammers.blogspot.com/2014/11/msbuild-targets-and-tasks.html
答案 2 :(得分:0)
由于IIS安全限制,您无法更改asp.net应用程序的输出目录,这就是它无法正常工作的原因。
如果您尝试通过DI管理dll,请将所有其他卫星dll复制到主asp.net应用的bin文件夹中