背景
我有一个在Windows 7(64位专业版)客户端上运行的服务,它定期检入服务器以获取更新,如果不存在,它会检查要复制到本地的新文件。我设置它的方式,服务器上的每个文件都用一个对象表示,该对象被视为与其余文件完全独立的实体。
由于文件可以来自具有不同凭据的不同位置,因此每个文件都被处理为自己的事务。打开连接,传输文件,关闭连接。每次更新都会处理数百个文件而不会出现问题。
问题不会发生,直到另一个更新在第一个更新后运行(在前一个完成之后的几分钟内),当发生这种情况时,第一次尝试连接到远程资源错误输出错误1312。 30秒后自动重试,直到它获得良好的连接,这需要几分钟,但在那之后它会经过并完成而不会再出现问题。
我尝试使用WNetAddConnection2和WNetUseConnection获得相同的结果,我使用WNetCancelConnection2关闭连接。
所有这些都发生在BackgroundWorker线程中(可能在下一个线程开始之前没有被清理?)
解释
[DllImport( "Mpr.dll" )]
private static extern int WNetUseConnection( IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID, int dwFlags, string lpAccessName, string lpBufferSize, string lpResult );
[DllImport( "Mpr.dll" )]
private static extern int WNetAddConnection2( NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags );
[DllImport( "Mpr.dll" )]
private static extern int WNetCancelConnection2( string lpName, int dwFlags, bool fForce );
[StructLayout( LayoutKind.Sequential )]
private class NETRESOURCE {
public int dwScope = 0;
public int dwType = 0;
public int dwDisplayType = 0;
public int dwUsage = 0;
public string lpLocalName = "";
public string lpRemoteName = "";
public string lpComment = "";
public string lpProvider = "";
}
const int RESOURCETYPE_DISK = 0x00000001;
const int CONNECT_TEMPORARY = 0x00000004;
使用示例
WNetUseConnection已经使用了很长时间,今晚我刚试过WNetAddConnection2
NETRESOURCE cNetworkResource = new NETRESOURCE();
cNetworkResource.dwType = RESOURCETYPE_DISK;
cNetworkResource.lpRemoteName = @"\\192.168.5.254\packages";
cNetworkResource.lpLocalName = "";
//int iReturnValue = WNetUseConnection( IntPtr.Zero, cNetworkResource, "Password", "Username", 0, null, null, null );
int iReturnValue = WNetAddConnection2( cNetworkResource, "Password", "Username", CONNECT_TEMPORARY );
用不同的方法我用
关闭它int iReturnValue = WNetCancelConnection2( @"\\192.168.5.254\packages", CONNECT_UPDATE_PROFILE, true );
注意:我使用路径,用户名和密码的变量而不是字符串文字,仅作为示例更新
目标服务器是一个linux盒子,对于这个例子,假设用户名和密码字面上是"用户名"和#34;密码"这是他们的格式。我已经尝试将服务器名称添加到用户名,例如" 192.168.5.254 \ Username"导致1219错误。
如果我重新启动客户端系统,它将不会在第一次尝试时出错,这使我相信这是在客户端与服务器上缓存或未正确处理的东西,我也观察到两种不同的相同行为linux服务器作为远程位置,运行不同版本的samba。
如果需要更多信息,我可以提供它,我有点在我的智慧结束,所以任何帮助都非常感谢。 TIA