Попытка чтения файла на сетевом компьютере
Использование .Net Core 3.1 в VS2019.
Приложение, которое будет работать в системе Linux, так что я не могу использовать какие-либо WinAPI вещи.
Я пытаюсь прочитать файл в локальной сетевой системе.
IP и путь верны (используя SSH, я могу подключиться к машине, перейти в нужную папку и фактически загрузить нужный файл в текстовый редактор).
Я получаю следующее исключение:
Message = "The network name cannot be found. : '\\\\192.168.1.10\\sys\\class\\thermal\\thermal_zone0\\temp'"
Трассировка стека выглядит следующим образом:
at System.Net.FileWebRequest.CreateResponse()\r\n at System.Net.FileWebRequest.<>c.<BeginGetResponse>b__59_0(Object s)\r\n at System.Threading.Tasks.Task`1.InnerInvoke()\r\n at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)\r\n at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)\r\n at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at System.Threading.Tasks.TaskToApm.End[TResult](IAsyncResult asyncResult)\r\n at System.Net.FileWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n at System.Net.FileWebRequest.GetResponse()\r\n at EyeSpyPiCLI.DomainReader.GetValue[T](PiSlice slice, T defaultValue) in G:\\dev\\EyeSpyPi\\EyeSpyPiCLI\\Program.cs:line 60\r\n at EyeSpyPiCLI.Program.Main(String[] args) in G:\\dev\\EyeSpyPi\\EyeSpyPiCLI\\Program.cs:line 16 // inner exception #1 at System.Net.FileWebResponse..ctor(FileWebRequest request, Uri uri, FileAccess access, Boolean useAsync)\r\n at System.Net.FileWebRequest.CreateResponse() // inner exception #2 at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)\r\n at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options)\r\n at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)\r\n at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync)\r at System.Net.FileWebResponse..ctor(FileWebRequest request, Uri uri, FileAccess access, Boolean useAsync)
Мне кажется, что он правильно аутентифицирует учетные данные, но не может открыть файл. Я посмотрел на файл с помощью ssh и вот что я получаю:
-r--r--r-- 1 root root 4096 Jul 5 06:04 temp
Я ведь смогу прочитать файл, верно? Или это потому, что он находится в папке sys? С другой стороны, если я предоставлю соответствующие учетные данные, он должен позволить мне прочитать файл, не так ли?
Поскольку этот код в конечном итоге будет работать на коробке linux, я не могу использовать библиотеки для Windows. Поскольку рассматриваемые папки по существу являются системными папками (
/etc
, /sys
и /proc
), Я не хочу ими делиться.Что я уже пробовал:
Многие вариации следующего (свойства определены, но эти определения опущены для краткости):
this.HostUri = new Uri(string.Format("\\\\{0}", this.MachineName)); this.Creds = new NetworkCredential(this.UserID, this.Password); this.CredCache = new CredentialCache(); this.CredCache.Add(HostUri, "Digest", this.Creds); ... string path = Path.Combine(this.HostUri.AbsoluteUri, "sys/class/thermal/thermal_zone0/temp"); FileWebRequest request = (FileWebRequest)WebRequest.Create(path); request.Method = WebRequestMethods.Http.Get; request.Credentials = this.CredCache.GetCredential(this.HostUri, "Digest"); System.Security.Principal.TokenImpersonationLevel.Impersonation; using (FileWebResponse response = (FileWebResponse)request.GetResponse()) { using(Stream stream = response.GetResponseStream()) { // handling the returned data (I haven't been able to get this far yet) } }
George Swan
Вы установили Samba на свой ящик? Я использую smb://boxname.local/pathToShare/ тег 'local' очень важен
#realJSOP
Самба есть на коробке, над которой я работаю, но не на всех удаленных машинах. Кстати, я еще не пробовал ".local".
Richard Deeming
NB: Установка FileWebRequest.Полномочия[^] в настоящее время не имеет никакого эффекта.