上传文件到另一台服务器时出现问题 [英] Problem while uploading file to another server

查看:83
本文介绍了上传文件到另一台服务器时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有与两台服务器通信的应用程序。 
1.主服务器(我的所有应用程序都在这里)
2.音频服务器(这里客户端在主服务器托管的应用程序的帮助下上传音频)
两台服务器都在LAN网络中。

我使用音频服务器的IP地址和凭据从本地计算机连接到音频服务器。当我尝试上传音频文件时,它会从本地计算机成功上传到音频服务器。

但是,当我从主服务器连接音频服务器与Audio Server的IP地址和凭据时,它会抛出异常,如

例外:指定的登录会话不存在。它可能已经被终止了。



这就是我正在做的事情



 使用(NetworkConnection.Access(AudioServer.NetworkPath.Remove( 0  2 ),AudioServer.Username,AudioServer.Password))
{
if (!Directory.Exists(destinationRootPath))
{
Directory.CreateDirectory(destinationRootPath);
}
// 此处的文件上传代码
}



这是我的网络课程



 < span class =code-keyword> public   class  NetworkConnection:IDisposable 
{
private string _remoteUncName;
private string _remoteComputerName;

public string RemoteComputerName
{
get
{
return this ._ remoteComputerName;
}
set
{
this ._ remoteComputerName = ;
this ._ remoteUncName = @ \ \ + ._ remoteComputerName;
}
}

public string UserName
{
get ;
set ;
}
public string 密码
{
< span class =code-keyword> get
;
set ;
}

#region Consts

private const int RESOURCE_CONNECTED = 0x00000001;
private const int RESOURCE_GLOBALNET = 0x00000002;
private const int RESOURCE_REMEMBERED = 0x00000003;

private const int RESOURCETYPE_ANY = 0x00000000;
private const int RESOURCETYPE_DISK = 0x00000001;
private const int RESOURCETYPE_PRINT = 0x00000002;

private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;

private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
private const int RESOURCEUSAGE_CONTAINER = 0x00000002;


private const int CONNECT_INTERACTIVE = 0x00000008;
private const int CONNECT_PROMPT = 0x00000010;
private const int CONNECT_REDIRECT = 0x00000080;
private const int CONNECT_UPDATE_PROFILE = 0x00000001;
private const int CONNECT_COMMANDLINE = 0x00000800;
private const int CONNECT_CMD_SAVECRED = 0x00001000;

private const int CONNECT_LOCALDRIVE = 0x00000100;

#endregion

#region错误

private const int NO_ERROR = 0 ;

private const int ERROR_ACCESS_DENIED = 5 ;
private const int ERROR_ALREADY_ASSIGNED = 85 ;
private const int ERROR_BAD_DEVICE = 1200 ;
private const int ERROR_BAD_NET_NAME = 67 ;
private const int ERROR_BAD_PROVIDER = 1204 ;
private const int ERROR_CANCELLED = 1223 ;
private const int ERROR_EXTENDED_ERROR = 1208 ;
private const int ERROR_INVALID_ADDRESS = 487 ;
private const int ERROR_INVALID_PARAMETER = 87 ;
private const int ERROR_INVALID_PASSWORD = 1216 ;
private const int ERROR_MORE_DATA = 234 ;
private const int ERROR_NO_MORE_ITEMS = 259 ;
private const int ERROR_NO_NET_OR_BAD_PATH = 1203 ;
private const int ERROR_NO_NETWORK = 1222 ;

private const int ERROR_BAD_PROFILE = 1206 ;
private const int ERROR_CANNOT_OPEN_PROFILE = 1205 ;
private const int ERROR_DEVICE_IN_USE = 2404 ;
private const int ERROR_NOT_CONNECTED = 2250 ;
private const int ERROR_OPEN_FILES = 2401 ;

#endregion

#region PInvoke签名

[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)]
私有 静态 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 = ;
}

#endregion

/// < 摘要 < span class =code-summarycomment>>
/// 为给定的计算机名创建NetworkShareAccesser。用户将被要求输入凭证
/// < / summary >
< span class =code-summarycomment> /// < param name =remoteComputerName > < / param >
/// < ; 返回 > < / returns >
< span class =code-keyword> public static NetworkConnection Access( string remoteComputerName)
{
return new NetworkConnection(remoteComputerName);
}

/// < 摘要 >
/// 使用给定的域/计算机名称,用户名和密码为给定的计算机名创建NetworkShareAccesser
< span class =code-summarycomment> /// < / summary >
/// < span class =code-comment> < param name =remoteComputerName > < / param >
/// < param name = domainOrComuterName > < / param >
/// < param name =userName > < ; / param >
/// < param name =password > < / param >
public static NetworkConnection Access( string remoteComputerName, string domainOrComuterName, string userName, string 密码)
{
return new NetworkConnection(remoteComputerName,
domainOrComuterName + @ \\ \\ + userName,
密码);
}

/// < 摘要 >
/// 使用给定的用户名(格式:domainOrComputername\Username)和密码
/// < / summary >
/// < param name =remoteComputerName > < / param >
/// < param name =userName > < / param >
/// < param name =password > < / param >
< span class =code-keyword> public
static NetworkConnection Access( string remoteComputerName,< span class =code-keyword> string
userName, string password)
{
return new NetworkConnection(remoteComputerName,
userName,
密码);
}

private NetworkConnection( string remoteComputerName)
{
RemoteComputerName = remoteComputerName;

this .ConnectToShare( this ._ remoteUncName, null null true );
}

private NetworkConnection( string remoteComputerName,字符串 userName,字符串密码)
{
RemoteComputerName = remoteComputerName;
UserName = userName;
密码=密码;

this .ConnectToShare( this ._ remoteUncName, this .UserName, this .Password, false );
}

private void ConnectToShare( string remoteUnc, string username, string password, bool promptUser)
{
NETRESOURCE nr = new NETRESOURCE
{
dwType = RESOURCETYPE_DISK,
lpRemoteName = remoteUnc
};

int 结果;
if (promptUser)
{
result = WNetUseConnection( IntPtr .Zero,nr, ,CONNECT_INTERACTIVE | CONNECT_PROMPT, null null null );
}
else
{
result = WNetUseConnection( IntPtr .Zero,nr,密码,用户名, 0 null null null );
}

如果(结果!= NO_ERROR)
{
throw new Win32Exception(result);
}
}

私有 void DisconnectFromShare( string remoteUnc)
{
int result = WNetCancelConnection2(remoteUnc,CONNECT_UPDATE_PROFILE,< span class =code-keyword> false );
if (result!= NO_ERROR)
{
throw < span class =code-keyword> new Win32Exception(result);
}
}

/// < 摘要 >
/// 执行与释放,释放或重置非托管资源相关的应用程序定义任务。
/// < / summary >
/// < filterpriority < span class =code-summarycomment>> 2 < / filterpriority >
public void Dispose()
{
this .DisconnectFromShare( this ._ remoteUncName) ;
}
}



我们非常感谢任何帮助





我尝试过:



我尝试使用Public和内部IP登录您可能会尝试将NetResource转换为结构而不是使用类。


我修复了它我的问题和解析方案

拥有,



问题是我登录时没有为服务器提供域名。因此,域名方法的重载对我有用。



这里是



 使用(NetworkConnection.Access(AudioServer.NetworkPath.Remove( 0  2 ),AudioServer.DomainName,AudioServer.Username,AudioServer.Password))
{
if (!Directory.Exists(destinationRootPath))
{
Directory.CreateDirectory(destinationRootPath);
}
// 此处的文件上传代码
}


I have application which communicate with Two servers.
1. Main Server (My all application are here)
2. Audio server (Here the client upload audio with help of application hosted at main server)
Both server are in LAN network.

I am connecting to Audio Server from my local machine with Audio server's IP address and credentials. When I am trying to upload audio file, it uploads successfully to Audio server from local machine.

But when I am connecting Audio server from main server with Audio Server's IP address and credentials it throws an exception like

Exception : A specified logon session does not exist. It may already have been terminated.


Here is what i am doing


using (NetworkConnection.Access(AudioServer.NetworkPath.Remove(0, 2), AudioServer.Username, AudioServer.Password))
                    {
                        if (!Directory.Exists(destinationRootPath))
                        {
                            Directory.CreateDirectory(destinationRootPath);
                        }
// file upload code here
}


Here is my network class


public class NetworkConnection : IDisposable
    {
        private string _remoteUncName;
        private string _remoteComputerName;

        public string RemoteComputerName
        {
            get
            {
                return this._remoteComputerName;
            }
            set
            {
                this._remoteComputerName = value;
                this._remoteUncName = @"\\" + this._remoteComputerName;
            }
        }

        public string UserName
        {
            get;
            set;
        }
        public string Password
        {
            get;
            set;
        }

        #region Consts

        private const int RESOURCE_CONNECTED = 0x00000001;
        private const int RESOURCE_GLOBALNET = 0x00000002;
        private const int RESOURCE_REMEMBERED = 0x00000003;

        private const int RESOURCETYPE_ANY = 0x00000000;
        private const int RESOURCETYPE_DISK = 0x00000001;
        private const int RESOURCETYPE_PRINT = 0x00000002;

        private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
        private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
        private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
        private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
        private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
        private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;

        private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
        private const int RESOURCEUSAGE_CONTAINER = 0x00000002;


        private const int CONNECT_INTERACTIVE = 0x00000008;
        private const int CONNECT_PROMPT = 0x00000010;
        private const int CONNECT_REDIRECT = 0x00000080;
        private const int CONNECT_UPDATE_PROFILE = 0x00000001;
        private const int CONNECT_COMMANDLINE = 0x00000800;
        private const int CONNECT_CMD_SAVECRED = 0x00001000;

        private const int CONNECT_LOCALDRIVE = 0x00000100;

        #endregion

        #region Errors

        private const int NO_ERROR = 0;

        private const int ERROR_ACCESS_DENIED = 5;
        private const int ERROR_ALREADY_ASSIGNED = 85;
        private const int ERROR_BAD_DEVICE = 1200;
        private const int ERROR_BAD_NET_NAME = 67;
        private const int ERROR_BAD_PROVIDER = 1204;
        private const int ERROR_CANCELLED = 1223;
        private const int ERROR_EXTENDED_ERROR = 1208;
        private const int ERROR_INVALID_ADDRESS = 487;
        private const int ERROR_INVALID_PARAMETER = 87;
        private const int ERROR_INVALID_PASSWORD = 1216;
        private const int ERROR_MORE_DATA = 234;
        private const int ERROR_NO_MORE_ITEMS = 259;
        private const int ERROR_NO_NET_OR_BAD_PATH = 1203;
        private const int ERROR_NO_NETWORK = 1222;

        private const int ERROR_BAD_PROFILE = 1206;
        private const int ERROR_CANNOT_OPEN_PROFILE = 1205;
        private const int ERROR_DEVICE_IN_USE = 2404;
        private const int ERROR_NOT_CONNECTED = 2250;
        private const int ERROR_OPEN_FILES = 2401;

        #endregion

        #region PInvoke Signatures

        [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 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 = "";
        }

        #endregion

        /// <summary>
        /// Creates a NetworkShareAccesser for the given computer name. The user will be promted to enter credentials
        /// </summary>
        /// <param name="remoteComputerName"></param>
        /// <returns></returns>
        public static NetworkConnection Access(string remoteComputerName)
        {
            return new NetworkConnection(remoteComputerName);
        }

        /// <summary>
        /// Creates a NetworkShareAccesser for the given computer name using the given domain/computer name, username and password
        /// </summary>
        /// <param name="remoteComputerName"></param>
        /// <param name="domainOrComuterName"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        public static NetworkConnection Access(string remoteComputerName, string domainOrComuterName, string userName, string password)
        {
            return new NetworkConnection(remoteComputerName,
                                            domainOrComuterName + @"\" + userName,
                                            password);
        }

        /// <summary>
        /// Creates a NetworkShareAccesser for the given computer name using the given username (format: domainOrComputername\Username) and password
        /// </summary>
        /// <param name="remoteComputerName"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        public static NetworkConnection Access(string remoteComputerName, string userName, string password)
        {
            return new NetworkConnection(remoteComputerName,
                                            userName,
                                            password);
        }

        private NetworkConnection(string remoteComputerName)
        {
            RemoteComputerName = remoteComputerName;

            this.ConnectToShare(this._remoteUncName, null, null, true);
        }

        private NetworkConnection(string remoteComputerName, string userName, string password)
        {
            RemoteComputerName = remoteComputerName;
            UserName = userName;
            Password = password;

            this.ConnectToShare(this._remoteUncName, this.UserName, this.Password, false);
        }

        private void ConnectToShare(string remoteUnc, string username, string password, bool promptUser)
        {
            NETRESOURCE nr = new NETRESOURCE
            {
                dwType = RESOURCETYPE_DISK,
                lpRemoteName = remoteUnc
            };

            int result;
            if (promptUser)
            {
                result = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
            }
            else
            {
                result = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);
            }

            if (result != NO_ERROR)
            {
                throw new Win32Exception(result);
            }
        }

        private void DisconnectFromShare(string remoteUnc)
        {
            int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false);
            if (result != NO_ERROR)
            {
                throw new Win32Exception(result);
            }
        }

        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        /// <filterpriority>2</filterpriority>
        public void Dispose()
        {
            this.DisconnectFromShare(this._remoteUncName);
        }
    }


Any help will be much appreciated



What I have tried:

I tried to login using Public as well internal IP and Credentials.

解决方案

You might try to turn NetResource into a struct instead of using a class.


I fixed it my own,

The issue was i didn't provide domain name to the server while login. Thus an overload of method with domain name worked for me.

here is it

using (NetworkConnection.Access(AudioServer.NetworkPath.Remove(0, 2), AudioServer.DomainName,AudioServer.Username, AudioServer.Password))
                    {
                        if (!Directory.Exists(destinationRootPath))
                        {
                            Directory.CreateDirectory(destinationRootPath);
                        }
// file upload code here
}


这篇关于上传文件到另一台服务器时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆