首先不要将您的数据源放到wwwroot
文件夹中,因为它是公开的。看看official docs:
您的应用程序的Web根目录是像CSS,JS和图像文件公开, 静态资源在你的项目目录。静态文件 中间件默认情况下只会提供Web根目录(和 子目录)中的文件。
所以移动Countries
文件夹在您的项目的根文件夹中。
要读取xml数据,您可以使用XmlSerializer
。我会尽量展示如何读取XML文件:
首先,我假定你有XML内容象下面这样:
<?xml version="1.0" encoding="UTF-8" ?>
<Container>
<Countries>
<Country>
<Code>Code1</Code>
<Title>Title1</Title>
</Country>
<Country>
<Code>Code2</Code>
<Title>Title2</Title>
</Country>
</Countries>
</Container>
首先描述类型
public class Country
{
public string Code { get; set; }
public string Title { get; set; }
}
public class Container
{
public Country[] Countries { get; set; }
}
之后创建XML序列化服务:
public interface ICountryService
{
Country[] GetCountries();
}
public class CountryService : ICountryService
{
private readonly IHostingEnvironment _env;
public CountryService(IHostingEnvironment env)
{
_env = env;
}
public Country[] GetCountries()
{
XmlSerializer ser = new XmlSerializer(typeof(Container));
FileStream myFileStream = new FileStream(_env.ContentRootPath + "\\Countries\\en-GB.xml", FileMode.Open);
return ((Container)ser.Deserialize(myFileStream)).Countries;
}
}
然后注册服务在ConfigureServices
方法:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<ICountryService, CountryService>();
}
最后注入和在任何地方使用它(如控制器)
public class SomeController : Controller
{
public SomeController(ICountryService countryService)
{
// use it
}
}
真正伟大的,详细的解答。您的解决方案工作完美我花了几次尝试去理解为什么出现错误,但是这是因为我的xml数据结构,但现在很明显。我非常感谢你的时间提供全面的答案。 – RobHurd
如果您不使用早期版本的asp.net中的属性,这是一个很好的答案。我使用属性将属性映射到数据成员。我如何在核心中完成这项工作? – phitch