我正在开发一个应用程序而不是数据库使用服务器根目录中的文件系统。它基本上是一个笔记应用程序,允许我保存笔记。每个注释都是Note
class
的序列化对象,由以下结构\ Data \ Notes \ MyUsername \ Title.txt
当我通过IIS Express在localhost上测试时,一切正常,我可以轻松地在那里一步一步。
但是,一旦我将应用程序发布到Azure,文件夹结构仍然存在(使用Controller
和Directory.GetFiles()
进行测试.GetDirectories()
来模拟文件夹浏览,所以我很确定文件在那里)但文件根本没有加载。
加载正在调用的脚本:
public T Load<T>(string filePath) where T : new()
{
StreamReader reader = null;
try
{
reader = new StreamReader(filePath);
var RawDB = reader.ReadToEnd();
return JsonConvert.DeserializeObject<T>(RawDB);
}
catch
{
return default(T);
}
finally
{
if (reader != null)
reader.Dispose();
}
}
由于我无法正常调试Azure上的应用程序,我尝试通过ViewData
尽可能多地转储信息,即使在那里,一切看起来都不错,路径匹配,但反序列化的对象仍为空,这只是在尝试打开现有笔记而不首先创建新笔记时(稍后会详细介绍)
此外,正如我所说,这些新笔记保存在文件夹结构中,左侧有一个Note侧边栏,允许用户在笔记之间切换。注释浏览器只不过是一个使用该文件夹.GetFiles()
收集的列表。
在Azure上,这可以正常工作,如果我要手动删除一个,它也会从侧边栏中删除。
现在这里是踢球者。在localhost上,添加注释会将其添加到侧边栏,我可以正常切换它们。
在Azure上添加注释会使所有视图仅显示该新注释,无论我打开哪个音符,新音符都不会存储在结构中(我不知道它最终会在哪里!)即使path通常在该点定义,它应该像在localhost上一样保存。
var model = new ViewNoteModel()
{
Note = Load<Note>($@"{NotePath}\{Title}.txt"), //Works on localhost, fails on Azure on many levels. Title is a URL param.
MyNotes = GetMyNotes() //works fine, reads right directory on local and Azure
};
总结一下: 在localhost上一切正常,重要的部分在Azure上不起作用。
如果未创建新笔记但打开现有笔记,则会在Localhost上加载正确的笔记(基于URL Param),它会在Azure上中断并加载默认的Note对象(不是null,只是默认构造函数数据,因为它是必需的作者:JsonConvert)
如果创建了新笔记,您将在Localhost上看到它并且您将能够打开所有其他笔记,无论选择何种笔记,您都将只看到Azure上的新笔记。
这真的很奇怪,我不知道是什么原因引起的?我认为它与Azure请求的处理方式有所不同,所以控制器可能会在模型完全初始化之前推送View,但这没有意义,因为这里没有任何异步。
然而,它加载服务器上不存在的注释这一事实更令人反感,我对此没有任何解释。 此外,此问题与会话无关。我通过手机登录,并立即在那里显示了假钞。
P.S。在您说存储之前,请注意这一点。我们的大学授予我们非常有限的Azure订阅。简单的最低层应用服务和5DTU SQL服务器以及99%的其他服务器被锁定在我们的订阅之外。这就是为什么我在服务器上存储东西,而不是因为我认为这是明智之举。