我有一个带有 IIS 设置的 Azure VM,它托管我的 ASP.Net 网站。
我希望能够通过使用普通的 Windows 类库 (System.IO) 从网络共享 (Azure 文件存储) 读取和写入文档/文件。我不想使用 Azure 存储客户端库或 Azure Storage Rest API。
如本文所述,我已安装共享并保留了我的凭据。
安装驱动器并保存我的凭据后,我将我的网站指向我的共享驱动器,以实现所有与文档管理相关的功能。下载文件完美无缺。但是,当我尝试创建文件夹或将文档写入网络共享时,我会收到错误消息。
我收到的错误是:
找不到路径“F:[RestOfThePathHere]”的一部分。堆栈跟踪:
[DirectoryNotFoundException: 找不到路径的一部分'F:\Test\MyThing\Clients\TheirStuff'。]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +338 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) +1578
System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost) +213
MyStuff.FileHandling.FileExtenders.SaveToFile(Byte[] ByteArray, String Directory, String FileName) +116
MyStuff.TheirStuff.BLL.TheirStuffTestClient.RunEnquiry(ClientBase client, String resultType) +3776
MyStuff.MyThing.UI.Views.ClientController.CreditCheck(Int64 id) +42
lambda_method(Closure, ControllerBase, Object[]) +114
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 个参数)+39 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState)+12 System.Web.Mvc.Async.WrappedAsyncResult 1。 CallEndDelegate(IAsyncResult asyncResult) +111 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +111 System.Web.CallHandlerExecutionStep.System.Web。 HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +2882 parameters) +242
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2.CallEndDelegate(IAsyncResult asyncResult) +139
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +112 System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +452 System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +37 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +241
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +19
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +51
System.Web.Mvc.Async.WrappedAsyncVoid
或者,当我使用 UNC 寻址时
找不到网络路径。StackTrace:[IOException:找不到网络路径。]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +14382132 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) +1578 System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost) +213
MyStuff.FileHandling.FileExtenders.SaveToFile(Byte[] ByteArray, String Directory, String FileName) +116
MyStuff.TheirStuff.BLL.TheirStuffTestClient.RunEnquiry(ClientBase client, String resultType) +3776
MyStuff.MyThing.UI。 Views.ClientController.CreditCheck(Int64 id) +42
lambda_method(Closure, ControllerBase, Object[]) +114
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 个参数)+39 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState)+12 System.Web.Mvc.Async.WrappedAsyncResult 1。 CallEndDelegate(IAsyncResult asyncResult) +111 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +111 System.Web.CallHandlerExecutionStep.System.Web。 HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +2882 parameters) +242
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2.CallEndDelegate(IAsyncResult asyncResult) +139
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +112 System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +452 System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +37 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +241
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +19
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +51
System.Web.Mvc.Async.WrappedAsyncVoid
更新 - 我当前的代码
MVC 控制器方法
public ActionResult Upload(DocumentUploadVM VM, long ClientId, long ContextInstanceId, long DocumentClassId, long TaskId)
{
var documentClass = docMan.Get_DocumentClass(DocumentClassId);
var errors = new List<string>();
if (VM.File == null || VM.File.ContentLength == 0)
errors.Add("You haven't selected a file to upload");
else if (!documentClass.MimeTypeAllowed(VM.File.ContentType, docMan))
errors.Add("The file type is forbidden");
if (errors.Count == 0 && ModelState.IsValid)
{
var path = settings.GetSettingValueAsString("Document Management: Client Documents Root Path").TrimEnd('\\') + "\\Uploads\\";
var pvtFileName = new Random().Next().ToString() + "." + VM.File.FileName.Split('.').Last();
var targetURI = Path.Combine(path, pvtFileName);
MemoryStream ms = new MemoryStream();
VM.File.InputStream.CopyTo(ms);
IFileHandler fh = FileHandlingFactory.Create();
fh.SaveFile(ms, targetURI);
docMan.Add_Document(
new FileItem
{
FilePathOnServer = path,
PublicFileName = VM.File.FileName,
PrivateFileName = pvtFileName,
MimeType = VM.File.ContentType
},
docMan.Get_ContextInstance(ContextInstanceId),
new List<DocumentClass> { documentClass });
}
else
{
TempData["errors"] = errors;
}
//TODO: In case of model errors, this call will suppress the errors. Look to TempData / PRG pattern to maintain model state over redirect.
return
RedirectToAction("ListClientDocuments", new { ClientId = ClientId, TaskId = TaskId });
}
IFileHandler.SaveFile 实现
public override void SaveFile(MemoryStream MemoryStream, string Fullpath)
{
var directory = Fullpath.Substring(0, Fullpath.LastIndexOf('\\')).TrimEnd('\\');
var fileName = Fullpath.Replace(directory, "").Trim('\\');
MemoryStream.ToArray()
.SaveToFile(directory, fileName);
}
PS - 请原谅糟糕的代码和公然无视 C# 编码标准。我写这篇文章的时候是个菜鸟。但是,当用于处理本地文件存储时,此代码还没有给我带来任何问题。