WNetAddConnection2重新连接在后续尝试时失败,错误为1312

时间:2015-04-11 00:06:56

标签: c# service windows-7 samba

背景

我有一个在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

0 个答案:

没有答案