Html 到Azure存储资源的链接仅在首次使用时有效

Html 到Azure存储资源的链接仅在首次使用时有效,html,azure,asp.net-core,azure-storage,azure-files,Html,Azure,Asp.net Core,Azure Storage,Azure Files,我们正在使用SAS密钥从Azure服务器访问文件。链接使用ASP.NET控制器检索,并使用HTML元素显示 我们第一次请求链接时,图像显示得非常完美。第二次请求图像时(例如,页面刷新),图像不会显示-控制台声明未找到图像的403文件。如果我们将链接从HTML元素复制到新的浏览器选项卡中,则会显示图像 有人有过这个问题的经验吗 谢谢 控制器 // GET: /<controller>/edit public async Task<IActionResult>

我们正在使用SAS密钥从Azure服务器访问文件。链接使用ASP.NET控制器检索,并使用HTML元素显示

我们第一次请求链接时,图像显示得非常完美。第二次请求图像时(例如,页面刷新),图像不会显示-控制台声明未找到图像的403文件。如果我们将链接从HTML元素复制到新的浏览器选项卡中,则会显示图像

有人有过这个问题的经验吗

谢谢

控制器

    // GET: /<controller>/edit
    public async Task<IActionResult> Edit(int id)
    {

        Checklist checklist = await AM.Checklist.FindAsync(id);

        if (checklist == null)
        {
            return StatusCode(404);
        }

        ChecklistViewModel cVM = new ChecklistViewModel(checklist);

        cVM.productPartNum = (await AM.Product.FindAsync(checklist.productNum)).partId;
        cVM.checklistTypesDropdown = await cVM.GetChecklistOptions(AM);
        List<Field> fields = await AM.Field.Where(x => x.checklistId == checklist.id).OrderBy(x=>x.section).ThenBy(x=>x.order).ToListAsync();




        //connect to the file storate account
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

        // Create a CloudFileClient object for credentialed access to File storage.
        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

        // Get a reference to the file share
        CloudFileShare share = fileClient.GetShareReference("newfileshare");


        string policyName = "sampleSharePolicy" + DateTime.UtcNow.Ticks;
        CloudFileDirectory rootDir = null;
        CloudFileDirectory fileDir = null;

        // Ensure that the share exists.
        if (share.Exists())
        {


            // Create a new shared access policy and define its constraints.
            SharedAccessFilePolicy sharedPolicy = new SharedAccessFilePolicy()
            {
                SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(8),
                Permissions = SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
            };

            // Get existing permissions for the share.
            FileSharePermissions permissions = await share.GetPermissionsAsync();

            //Check length of SharedAccessPolicies
            if (permissions.SharedAccessPolicies.Count >= 5)
            {
                permissions.SharedAccessPolicies.Remove(permissions.SharedAccessPolicies.Keys.First());
            }

            // Add the shared access policy to the share's policies. Note that each policy must have a unique name.
            permissions.SharedAccessPolicies.Add(policyName, sharedPolicy);
            await share.SetPermissionsAsync(permissions);

            // Generate a SAS for a file in the share and associate this access policy with it.
            rootDir = share.GetRootDirectoryReference();
        }



        cVM.changeHappened = new List<bool>();

        cVM.Fields = new List<FieldViewModel>();
        int i = 0;
        foreach(Field f in fields)
        {
            FieldViewModel newFVM = new FieldViewModel(f);

            cVM.changeHappened.Add(false);

            if (f.attachmentReq && f.attachmentData != null)
            {

                //changeHappened will keep track of what images have been changed in order to avoid resubmitting same images
                cVM.changeHappened.Add(false);



                if (f.attachmentType.Contains("image"))
                {
                    fileDir = rootDir.GetDirectoryReference("Images");
                }
                else
                {
                    fileDir = rootDir.GetDirectoryReference("files");
                }

                CloudFile file = fileDir.GetFileReference(f.attachmentData);
                string sasToken = file.GetSharedAccessSignature(null, policyName);
                string tick = $"&{ DateTimeOffset.UtcNow.Ticks}";
                Uri fileSasUri = new Uri(file.StorageUri.PrimaryUri.ToString() + sasToken + tick);

                newFVM.link = fileSasUri.AbsoluteUri;

                //// Create a new CloudFile object from the SAS, and write some text to the file.
                //CloudFile fileSas = new CloudFile(fileSasUri);
                //fileSas.UploadText("This write operation is authenticated via SAS.");
                //Console.WriteLine(fileSas.DownloadText());
            }



            if (newFVM.textReq)
            {
                newFVM.fieldDropdownOptions = await newFVM.getDropdownOptions(AM);
            }

            cVM.Fields.Add(newFVM);
        }

        return View(cVM);
    }
//GET://edit
公共异步任务编辑(int-id)
{
检查表=等待AM.检查表.FindAsync(id);
如果(检查表==null)
{
返回状态码(404);
}
ChecklistViewModel cVM=新的ChecklistViewModel(检查表);
cVM.productPartNum=(wait AM.Product.FindAsync(checklist.productNum)).partId;
cVM.checklistTypesDropdown=等待cVM.GetChecklistOptions(AM);
List fields=await AM.Field.Where(x=>x.checklistId==checklist.id).OrderBy(x=>x.section).ThenBy(x=>x.order.ToListAsync();
//连接到文件存储帐户
CloudStorageAccount-storageAccount=CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(“StorageConnectionString”);
//创建一个CloudFileClient对象,用于对文件存储进行认证访问。
CloudFileClient fileClient=storageAccount.CreateCloudFileClient();
//获取对文件共享的引用
CloudFileShare=fileClient.GetShareReference(“newfileshare”);
字符串policyName=“sampleSharePolicy”+DateTime.UtcNow.Ticks;
CloudFileDirectory rootDir=null;
CloudFileDirectory fileDir=null;
//确保共享存在。
if(share.Exists())
{
//创建新的共享访问策略并定义其约束。
SharedAccessFilePolicy sharedPolicy=新的SharedAccessFilePolicy()
{
SharedAccessStartTime=DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime=DateTime.UtcNow.AddHours(8),
权限=SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
};
//获取共享的现有权限。
FileSharePermissions permissions=wait share.GetPermissionsAsync();
//检查SharedAccessPolicys的长度
如果(permissions.SharedAccessPolicys.Count>=5)
{
permissions.SharedAccessPolicys.Remove(permissions.SharedAccessPolicys.Keys.First());
}
//将共享访问策略添加到共享的策略中。请注意,每个策略必须具有唯一的名称。
permissions.SharedAccessPolicys.Add(policyName,sharedPolicy);
等待共享。SetPermissionsAsync(权限);
//为共享中的文件生成SAS,并将此访问策略与其关联。
rootDir=share.GetRootDirectoryReference();
}
cVM.changeOccessed=新列表();
cVM.Fields=新列表();
int i=0;
foreach(字段中的字段f)
{
FieldViewModel newFVM=新的FieldViewModel(f);
cVM.ChangeOccessed.Add(假);
if(f.attachmentrq&&f.attachmentData!=null)
{
//ChangeOccessed将跟踪已更改的图像,以避免重新提交相同的图像
cVM.ChangeOccessed.Add(假);
if(f.attachmentType.Contains(“图像”))
{
fileDir=rootDir.GetDirectoryReference(“图像”);
}
其他的
{
fileDir=rootDir.GetDirectoryReference(“文件”);
}
CloudFile file=fileDir.GetFileReference(f.attachmentData);
字符串sasToken=file.GetSharedAccessSignature(null,policyName);
字符串tick=$“&{DateTimeOffset.UtcNow.Ticks}”;
Uri FILEASURI=新Uri(file.StorageUri.PrimaryUri.ToString()+sasToken+tick);
newFVM.link=fileSasUri.AbsoluteUri;
////从SAS创建一个新的CloudFile对象,并将一些文本写入该文件。
//CloudFile fileSas=新的CloudFile(fileSasUri);
//UploadText(“此写入操作通过SAS进行身份验证”);
//WriteLine(fileas.DownloadText());
}
if(newFVM.textReq)
{
newFVM.fieldDropdownOptions=等待newFVM.getDropdownOptions(AM);
}
cVM.Fields.Add(newFVM);
}
返回视图(cVM);
}
显示图像的Div

                                        <div class="col-sm-5">


                                            @if (Model.Fields[i].attachmentData != null)
                                            {
                                                @if (Model.Fields[i].attachmentType.Contains("image/"))
                                                {

                                                    <img src="@Model.Fields[i].link" id="image_@i" height="50" width="50" align="middle"/>
                                                    <a hidden="hidden" id="link_@i"></a>
                                                }
                                                else
                                                {
                                                    <img hidden="hidden" id="image_@i" height="50" width="50" align="middle"/>
                                                    <a id="link_@i">@Model.Fields[i].attachmentData</a>
                                                }

                                            }
                                            else
                                            {
                                                <img hidden="hidden" id="image_@i" height="50" width="50" align="middle"/>
                                                <a hidden="hidden" id="link_@i"></a>
                                            }

                                        </div>

@if(Model.Fields[i].attachmentData!=null)
{
@if(Model.Fields[i].attachmentType.Contains(“image/”))
{
}
其他的
{
@Model.Fields[i].attachmentData
}
}
其他的
{
}

根据您的描述和合作伙伴
    //connect to the file storate account
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(" ");

    // Create a CloudFileClient object for credentialed access to File storage.
    CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

    // Get a reference to the file share
    CloudFileShare share = fileClient.GetShareReference("brandofirstsharetest");


    string policyName = "sampleSharePolicy" + DateTime.UtcNow.Ticks;
    CloudFileDirectory rootDir = null;
    CloudFileDirectory fileDir = null;

    // Ensure that the share exists.
    if (share.Exists())
    {

        // Get existing permissions for the share.
        FileSharePermissions permissions = await share.GetPermissionsAsync();
        //if the SharedAccessPolicies is exists just get the SharedAccessPolicies
        if (permissions.SharedAccessPolicies.Count > 0)
        {
                policyName = permissions.SharedAccessPolicies.First().Key;
                SharedAccessFilePolicy sharedPolicy = permissions.SharedAccessPolicies.First().Value;
                sharedPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(8);
                await share.SetPermissionsAsync(permissions);                  
        }
        else
        {
            // Create a new shared access policy and define its constraints.
            SharedAccessFilePolicy sharedPolicy = new SharedAccessFilePolicy()
            {
                SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(8),
                Permissions = SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
            };
            permissions.SharedAccessPolicies.Add(policyName, sharedPolicy);
            await share.SetPermissionsAsync(permissions);
        }


        // Add the shared access policy to the share's policies. Note that each policy must have a unique name.


        // Generate a SAS for a file in the share and associate this access policy with it.
        rootDir = share.GetRootDirectoryReference();
    }

    CloudFile file = rootDir.GetFileReference("Penjs.png");
       string sasToken = file.GetSharedAccessSignature(null, policyName);
       string tick = $"&{ DateTimeOffset.UtcNow.Ticks}";
       Uri fileSasUri = new Uri(file.StorageUri.PrimaryUri.ToString() + sasToken + tick);