我使用ASP.NET Core 2.1
,尝试将网站发布到托管环境(Azure Web Apps)后,通过Visual Studio 2017在本地开发机上加载相同的静态文件。
请考虑将要提供的静态文件(file.xml
)驻留在Web根目录中的目录层次结构:
wwwroot
css
images
js
xml
file.xml
这是我的控制器,用于加载文件:
public class DevelopmentController : Controller
{
private readonly IHostingEnvironment _env;
public DevelopmentController(IHostingEnvironment env)
{
_env = env;
}
public async Task<string> Test()
{
string result = "";
// Test Code Here
XmlDocument doc = new XmlDocument();
doc.Load(Path.Combine(_env.WebRootPath, "xml", "file.xml"));
return result;
}
}
这会将文件本地加载到我的开发机器上,但是,一旦将Web应用发布到Azure,我会收到以下错误消息:
DirectoryNotFoundException:找不到路径的一部分 'D:\ home \ site \ wwwroot \ wwwroot \ xml \ file.xml'
无论我尝试什么,在将文件发布到Azure之后,似乎都无法加载文件。
注意:在ASP.NET MVC 5
中,我曾经能够使用Server.MapPath()
函数来加载静态文件,该文件在本地和Azure中均可使用。例如:
doc.Load(System.Web.HttpContext.Current.Server.MapPath("~/xml/file.xml"));
但是自升级到ASP.NET Core 2.1
以来,我不知道执行此操作的正确方法,当托管在Azure上时也可以使用。
这些是Microsoft文档,我已将其用作参考: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.1&tabs=aspnetcore2x
更新
如果其他任何人遇到相同的问题,这就是问题所在:
如果将文件夹拖放到Solution Explorer
中,则引用不会自动添加到.csproj
文件中。
您可以通过右键单击项目并选择.csproj
来检查Edit {Project Name}.csproj
文件。对于您添加到wwwroot
目录中的所有其他文件夹,您应该会看到类似以下内容的
<ItemGroup>
<Folder Include="wwwroot\myfolder\" />
</ItemGroup>
如果您看不到它,那么它将不会发布到Azure。
注意:如果看到<None ...
,则表明该文件夹已设置为排除发布。
<ItemGroup>
<None Include="wwwroot\myexcludedfolder\"
</ItemGroup>
解决方案
我刚刚删除了拖放到Solution Explorer中的文件夹,而是右键单击wwwroot
以这种方式创建该文件夹。
答案 0 :(得分:1)
看来您的问题是此文件未发布,并且与运行时发生的情况无关。
如果在本地运行/*===========================================================
' Error Codes
'===========================================================*/
public const int SCARD_F_INTERNAL_ERROR = -2146435071;
public const int SCARD_E_CANCELLED = -2146435070;
public const int SCARD_E_INVALID_HANDLE = -2146435069;
public const int SCARD_E_INVALID_PARAMETER = -2146435068;
public const int SCARD_E_INVALID_TARGET = -2146435067;
public const int SCARD_E_NO_MEMORY = -2146435066;
public const int SCARD_F_WAITED_TOO_LONG = -2146435065;
public const int SCARD_E_INSUFFICIENT_BUFFER = -2146435064;
public const int SCARD_E_UNKNOWN_READER = -2146435063;
public const int SCARD_E_TIMEOUT = -2146435062;
public const int SCARD_E_SHARING_VIOLATION = -2146435061;
public const int SCARD_E_NO_SMARTCARD = -2146435060;
public const int SCARD_E_UNKNOWN_CARD = -2146435059;
public const int SCARD_E_CANT_DISPOSE = -2146435058;
public const int SCARD_E_PROTO_MISMATCH = -2146435057;
public const int SCARD_E_NOT_READY = -2146435056;
public const int SCARD_E_INVALID_VALUE = -2146435055;
public const int SCARD_E_SYSTEM_CANCELLED = -2146435054;
public const int SCARD_F_COMM_ERROR = -2146435053;
public const int SCARD_F_UNKNOWN_ERROR = -2146435052;
public const int SCARD_E_INVALID_ATR = -2146435051;
public const int SCARD_E_NOT_TRANSACTED = -2146435050;
public const int SCARD_E_READER_UNAVAILABLE = -2146435049;
public const int SCARD_P_SHUTDOWN = -2146435048;
public const int SCARD_E_PCI_TOO_SMALL = -2146435047;
public const int SCARD_E_READER_UNSUPPORTED = -2146435046;
public const int SCARD_E_DUPLICATE_READER = -2146435045;
public const int SCARD_E_CARD_UNSUPPORTED = -2146435044;
public const int SCARD_E_NO_SERVICE = -2146435043;
public const int SCARD_E_SERVICE_STOPPED = -2146435042;
public const int SCARD_W_UNSUPPORTED_CARD = -2146435041;
public const int SCARD_W_UNRESPONSIVE_CARD = -2146435040;
public const int SCARD_W_UNPOWERED_CARD = -2146435039;
public const int SCARD_W_RESET_CARD = -2146435038;
public const int SCARD_W_REMOVED_CARD = -2146435037;
,则可能会看到相同的行为,而发布文件夹中可能缺少该文件。
关于为什么尚未发布,我不是该部分的专家,但是此答案可能会有所帮助:ASP.NET Core: Exclude or include files on publish
答案 1 :(得分:0)
尝试:
XmlDocument doc = new XmlDocument();
doc.Load(_env.ContentRootPath + "\\xml\\file.xml", FileMode.Open);
答案 2 :(得分:0)
对于遇到此问题但对于.js
个文件(或类似文件)的用户,请确保在environment
中正确设置了View
。
默认示例为:
<environment exclude="Development">
<script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>
所有工作都在site.js
中完成,否 site.min.js
。发布将使用与开发中不同的environment
,这会对您的结果产生影响。