更改 WebApi 应用程序的构建输出目录
Posted
技术标签:
【中文标题】更改 WebApi 应用程序的构建输出目录【英文标题】:Change Build Output Directory of WebApi Application 【发布时间】:2015-04-24 16:21:46 【问题描述】:我是一个开发大型应用程序的团队的一员。我是这个团队的新成员,并且正在构建一个新的应用程序。作为此过程的一部分,我创建了一个 WebApi 应用程序,该应用程序将公开一些 HTTP 端点,我将通过这些端点检索有关该应用程序的信息。
由于需要很长时间才能解释的情况,我想让 WebApi 项目在另一个目录中构建,特别是 ..\bin\Server\Debug\
,因为这是应用程序的大多数其他部分构建的地方。除了该应用程序尝试使用基于当前对我的 WebApi 应用程序错误的工作目录找到的文件外,我不会打扰。
我尝试在项目设置中更改它,现在我收到此错误:
到目前为止,我的谷歌搜索几乎没有什么帮助。有谁知道如何解决这个问题?
【问题讨论】:
我遇到了同样的问题。有谁知道如何调试这个?为什么WebApiApplication
需要有一个 `bin` 的输出构建目录?
这可能是一个密集的问题,但您是否重建了所有解决方案?您是否从其他地方手动将任何程序集复制到您的 bin 中?
@Irb 是的,我重建了解决方案。不,我没有从其他地方将任何程序集复制到 bin 中。
当你点击引用的文件JDX.WebApi.WebApiApplication,在你的项目中,属性资源管理器中的Copy Local属性是否设置为True?您最近是否重命名了您的项目?
是 JDX.WebApi.WebApiApplication 所依赖的“应用程序的其他部分”程序集吗?
【参考方案1】:
尝试在配置中添加运行时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 not found 等错误。有一个奇怪的修复它开始在编译下将程序集添加到程序集标记。
<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,在项目中直接引用了二进制文件。
当网络服务器收到 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 模板,出现了从 project -> properties -> Build -> Bin
更改目录的选项。这为用户提供了与任何其他项目相同的外观。但是 asp.net 网站的功能保持不变。 Bin
文件夹仍然像以前在 Asp.net 的旧 website
模板中一样工作。
【讨论】:
是否必须手动将其更改为bin\server\Release
才能在 Release
模式下运行?
您可以使用转换功能来避免手动更改发布。在 web.config 下会有 web.debug.config 和 web.release.config。把“bin\server\Debug;”在调试和“bin\server\Release;”在发布配置文件中。
刚刚尝试过,我仍然看到同样的错误。我确保我的“输出路径”设置为bin\server\Debug
,然后将上面的代码添加到web.debug.config
(以及相应的发布更改)。
@Brett 更新了我的答案。【参考方案2】:
由于 IIS 安全限制,您无法更改 asp.net 应用程序的输出目录,这就是它不起作用的原因。
如果您由于 DI 尝试管理 dll,请将所有其他附属 dll 复制到主 asp.net 应用程序的 bin 文件夹中
【讨论】:
【参考方案3】:您可以尝试使用 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
【讨论】:
以上是关于更改 WebApi 应用程序的构建输出目录的主要内容,如果未能解决你的问题,请参考以下文章
如何为 dotnet core(web Api) 代码更改以及 TypeScript 代码更改启用实时重新加载