#realJSOP Ответов: 2

Попытка чтения файла на сетевом компьютере


Использование .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.Полномочия[^] в настоящее время не имеет никакого эффекта.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Разве Uri пути запроса файла не должен начинаться с "file://имя сервера/путь"??

Я этого еще не пробовал. Это просто дикое предположение.


#realJSOP

да, именно так выглядит тропинка. Никакой работницы. Исключение - показать его таким образом, но я использую Uri и отправляю его как "file://...".

Рейтинг:
1

Garth J Lancaster

Вот что меня раздражает:

FileWebRequest request = (FileWebRequest)WebRequest.Create(path);
если вы проходите через веб-сервер, то файловая система, которую вы можете "видеть", относится к веб-серверу, не так ли ?

Это не означает, что вы не можете добавить ссылку в общедоступное файловое пространство веб-сервера в свой файл sys/..../


#realJSOP

Ну, я не хочу делать что-то на удаленном устройстве (так получилось, что это raspberry pi), чтобы заставить его работать, но в то же время этот код в конечном итоге будет запускаться из веб-приложения .net core на коробке linux, поэтому я не могу использовать для этого специфичный для windows код. Я не знаю другого способа сделать это. :/