新的.csproj格式对经典文件进行了一些重大改进,包括与NuGet软件包管理的紧密集成以及冗长的结构。我想在仍然使用.NET Framework 4.6和ASP.NET的同时获得这些好处(因为我的项目依赖于尚未产生.NET Core版本的Umbraco)。
最大的挑战似乎是调试经验-ASP.NET Core项目希望运行dotnet核心应用程序并为IIS实例设置反向代理。该过程完全与.NET Framework模型无关,我不知道从哪里开始尝试在Visual Studio中设置调试。
有什么办法可以将这两个项目模型混合使用?
GitHub上有很多关于ASP.NET(非核心)应用程序支持新的csproj格式的开放性问题。他们中的一些:
你可能已经了解,ASP.NET应用程序尚不支持新的csproj格式。可以使其工作,但是它并不流畅。
前一段时间,我想以新的csproj格式创建ASP.NET MVC项目,只是为了好玩。我使它工作了,但是我并没有玩太多。因此,了解你的经历将很有趣。
步骤如下:
删除旧的不需要的项目文件:
使用以下内容创建新的MvcApplication.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<OutputPath>bin\</OutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Antlr" version="3.4.1.9004" />
<PackageReference Include="bootstrap" version="3.0.0" />
<PackageReference Include="jQuery" version="1.10.2" />
<PackageReference Include="jQuery.Validation" version="1.11.1" />
<PackageReference Include="Microsoft.ApplicationInsights" version="2.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights.Web" version="2.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights.WindowsServer" version="2.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" />
<PackageReference Include="Microsoft.AspNet.Mvc" version="5.2.3" />
<PackageReference Include="Microsoft.AspNet.Razor" version="3.2.3" />
<PackageReference Include="Microsoft.AspNet.Web.Optimization" version="1.1.3" />
<PackageReference Include="Microsoft.AspNet.WebPages" version="3.2.3" />
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" />
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
<PackageReference Include="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" />
<PackageReference Include="Microsoft.Net.Compilers" version="2.1.0" developmentDependency="true" />
<PackageReference Include="Microsoft.Web.Infrastructure" version="1.0.0.0" />
<PackageReference Include="Modernizr" version="2.6.2" />
<PackageReference Include="Newtonsoft.Json" version="6.0.4" />
<PackageReference Include="Respond" version="1.2.0" />
<PackageReference Include="WebGrease" version="1.5.2" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Web" />
</ItemGroup>
<ItemGroup>
<Compile Update="Global.asax.cs">
<DependentUpon>Global.asax</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Web.*.config">
<DependentUpon>Web.config</DependentUpon>
<SubType>Designer</SubType>
</Content>
</ItemGroup>
</Project>
上面的长软件包列表包括为默认ASP.NET MVC应用程序添加的默认软件包。你应该添加应用程序使用的其他软件包。
不要忘了添加Microsoft.CSharp
软件包,否则你将在ViewBag
分配时收到以下编译错误:
错误CS0656:缺少编译器所需的成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
在ASP.NET项目中,Microsoft.CSharp
添加为对该项目的引用。但是最好将其作为NuGet包使用。
唯一无法避免的直接参考是System.Web
。
调试项目
当你说调试可能会很痛苦时,你是对的。由于Visual Studio不知道它是ASP.NET应用程序,因此没有立即启动调试会话的方法。
我在这里看到2种可能的解决方案:
一种。使用IIS Express进行调试。
基于IIS Express可执行文件配置调试非常容易。只需创建以下调试配置文件:
对应的launchSettings.json:
{
"profiles": {
"ASP.NET Old csproj": {
"commandName": "Executable",
"executablePath": "c:\\Program Files\\IIS Express\\iisexpress.exe",
"commandLineArgs": "/path:\"$(SolutionDir)$(ProjectName)\" /port:12345"
}
}
b。使用IIS进行调试。
在IIS管理器中,创建指向你的项目目录的应用程序。现在,你可以通过附加到w3wp.exe
进程来调试应用程序。
这是GitHub上的示例项目。按照上面的步骤,它基本上是默认的ASP.NET MVC项目,已迁移为新的csproj格式。可以对其进行编译,执行和调试(包括IIS Express的配置文件)
这是使用IIS Express的好方法。完美解决方案唯一缺少的是ASP.NET Core如何使用“ wwwroot”文件夹包含所有静态资产,而该文件夹仍使用项目根目录。我认为
/path
启动应用程序时对开关进行更改将是一个答案。不确定我是否正确理解您。是的,ASP.NET Core更改了静态文件的处理,现在所有静态内容都驻留在wwwroot中。默认情况下,这只是ASP.NET Core Web Host使用的位置。但是,它与csproj文件结构无关。而且,由于我们讨论了ASP.NET(非核心),
wwwroot
因此在这里不起作用。所有ASP.NET静态内容的文件夹(如Content
,fonts
,Scripts
)同时拥有项目目录中相同的相对位置和部署应用程序的目录。这似乎也破坏了Web发布-它似乎现在仅提供文件夹目标,而不提供WebDeploy之类的东西。
有没有人设法通过命令行来部署它?
dotnet publish
似乎没有产生有效的输出。在iis Express中运行时,示例项目给我一个403错误。<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
这<OutputPath>bin</OutputPath>
就是为什么我的IIS无法找到我的DLL。IIS查找.\bin
而不是.\bin\DebugOrRelease\net451