抛出异常:'System.IO.FileNotFoundException' in C# Windows 实例化实体数据模型对象时的服务
Exception Thrown: 'System.IO.FileNotFoundException' in C# Windows Service When Entity Data Model Object Instantiated
Windows Server 2012 R2 Standard 上的 运行 是一个 C# Windows 服务(.Net Framework 4.7。 2) 使用我写的 Entity Framework 从文件中读取数据并将数据传递给 local SQLExpress (2016) 将数据插入数据库的存储过程。
在我的 Windows 10 机器上测试它工作正常,但是在将可执行文件和 exe.config 移动到 Windows 服务器并使用正确的数据库信息更新配置之后连接字符串,事件查看器显示以下 Windows 应用程序错误:
来源:.NET 运行时事件 1026
Application: Print_Mail-DBAuger.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
at Print_Mail_DBAuger.Program.StartParseAndInsert(System.String, System.Diagnostics.EventLog)
at Print_Mail_DBAuger.FetchService.OnChanged(System.Object, System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32, System.String)
at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
这似乎阻止了调用存储过程,因此没有数据被传递到数据库。
我已将问题缩小到实体数据模型对象的实例化:
PrintMailEntities dataEntities = new PrintMailEntities();
此行调用由 Entity Framework:
创建的自动生成的代码
public partial class PrintMailEntities : DbContext
{
public PrintMailEntities()
: base("name=PrintMailEntities")
{
}
// Several more auto-generated methods...
}
和超级 class 构造函数(同样,Entity Framework 的一部分,不是我的代码):
public class DbContext : IDisposable, IObjectContextAdapter
{
//
// Summary:
// Constructs a new context instance using the given string as the name or connection
// string for the database to which a connection will be made. See the class remarks
// for how this is used to create a connection.
//
// Parameters:
// nameOrConnectionString:
// Either the database name or a connection string.
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
[SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public DbContext(string nameOrConnectionString);
// Other overrloaded constructors not used...
}
该行之前的程序中的所有内容都按预期工作(我使用了几个应用程序事件日志来跟踪发生的事情,因为我在 Windows 服务器上没有 Visual Studio 用于调试.) 我试图读取的文件不是问题,我可以很好地读取该信息。
我也曾尝试用 try/catch 围绕实例化来捕捉 FileNotFoundException,但从未触发捕捉。我还镜像了 Windows 服务器数据库的数据库权限以匹配我本地机器数据库的数据库权限,并且 运行 都具有管理员权限。
这是 Windows 服务器中的连接字符串 exe.config:
<connectionStrings>
<add name="PrintMailEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=machineName\HPWJA;initial catalog=PrintMail;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
同样,这在 Windows 10 上工作正常,连接字符串指向镜像 Windows 服务器数据库的数据库。我的机器上没有构建错误,Windows 服务器上也没有 SQL 服务器日志表明数据库端发生了任何错误。
编辑
多亏了 RB,我现在有了关于这个找不到的“文件”的更多详细信息。这是更新的事件日志。
Error: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
at Print_Mail_DBAuger.Program.StartParseAndInsert(String inputFile, EventLog programEventLog)
at Print_Mail_DBAuger.FetchService.OnChanged(Object sender, FileSystemEventArgs e)
EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 was missing.
错误似乎引用了 app.config
中的部分元素
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
服务器没有互联网,所以它可能正在尝试从网上提取 nuget 包?
问题是我缺少在构建输出的 Release 目录中找到的 EntityFramework.dll。添加 EntityFramework.dll 和 EntityFramework.SqlServer.dll 解决了这个问题。感谢 RB 帮我找到这个。
运行 是一个 C# Windows 服务(.Net Framework 4.7。 2) 使用我写的 Entity Framework 从文件中读取数据并将数据传递给 local SQLExpress (2016) 将数据插入数据库的存储过程。
在我的 Windows 10 机器上测试它工作正常,但是在将可执行文件和 exe.config 移动到 Windows 服务器并使用正确的数据库信息更新配置之后连接字符串,事件查看器显示以下 Windows 应用程序错误:
来源:.NET 运行时事件 1026
Application: Print_Mail-DBAuger.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
at Print_Mail_DBAuger.Program.StartParseAndInsert(System.String, System.Diagnostics.EventLog)
at Print_Mail_DBAuger.FetchService.OnChanged(System.Object, System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32, System.String)
at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
这似乎阻止了调用存储过程,因此没有数据被传递到数据库。
我已将问题缩小到实体数据模型对象的实例化:
PrintMailEntities dataEntities = new PrintMailEntities();
此行调用由 Entity Framework:
创建的自动生成的代码public partial class PrintMailEntities : DbContext
{
public PrintMailEntities()
: base("name=PrintMailEntities")
{
}
// Several more auto-generated methods...
}
和超级 class 构造函数(同样,Entity Framework 的一部分,不是我的代码):
public class DbContext : IDisposable, IObjectContextAdapter
{
//
// Summary:
// Constructs a new context instance using the given string as the name or connection
// string for the database to which a connection will be made. See the class remarks
// for how this is used to create a connection.
//
// Parameters:
// nameOrConnectionString:
// Either the database name or a connection string.
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
[SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public DbContext(string nameOrConnectionString);
// Other overrloaded constructors not used...
}
该行之前的程序中的所有内容都按预期工作(我使用了几个应用程序事件日志来跟踪发生的事情,因为我在 Windows 服务器上没有 Visual Studio 用于调试.) 我试图读取的文件不是问题,我可以很好地读取该信息。
我也曾尝试用 try/catch 围绕实例化来捕捉 FileNotFoundException,但从未触发捕捉。我还镜像了 Windows 服务器数据库的数据库权限以匹配我本地机器数据库的数据库权限,并且 运行 都具有管理员权限。
这是 Windows 服务器中的连接字符串 exe.config:
<connectionStrings>
<add name="PrintMailEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=machineName\HPWJA;initial catalog=PrintMail;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
同样,这在 Windows 10 上工作正常,连接字符串指向镜像 Windows 服务器数据库的数据库。我的机器上没有构建错误,Windows 服务器上也没有 SQL 服务器日志表明数据库端发生了任何错误。
编辑
多亏了 RB,我现在有了关于这个找不到的“文件”的更多详细信息。这是更新的事件日志。
Error: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
at Print_Mail_DBAuger.Program.StartParseAndInsert(String inputFile, EventLog programEventLog)
at Print_Mail_DBAuger.FetchService.OnChanged(Object sender, FileSystemEventArgs e)
EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 was missing.
错误似乎引用了 app.config
中的部分元素<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
服务器没有互联网,所以它可能正在尝试从网上提取 nuget 包?
问题是我缺少在构建输出的 Release 目录中找到的 EntityFramework.dll。添加 EntityFramework.dll 和 EntityFramework.SqlServer.dll 解决了这个问题。感谢 RB 帮我找到这个。