更改WebApi应用程序的构建输出目录

时间:2015-04-24 16:21:46

标签: c# iis asp.net-web-api

我是一个处理大型应用程序的团队的一员。我是这个团队的新成员,正在构建一个新的应用程序。作为此过程的一部分,我创建了一个WebApi应用程序,它将公开一些HTTP端点,通过它我将检索有关该应用程序的信息。

由于条件需要花费很长时间才能解释,我想让WebApi项目在另一个目录中构建,特别是..\bin\Server\Debug\,因为这是应用程序的大多数其他部分构建到。我不打扰,除了应用程序试图使用基于工作目录找到的文件,这对我的WebApi应用程序来说是错误的。

我尝试在项目设置中更改它,现在我收到此错误: Could not load type WebApiApplication

到目前为止,我的谷歌搜索引起了一些帮助。任何人都知道如何解决这个问题?

3 个答案:

答案 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文件夹中