Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetAzureADAppOnlyAuthenticatedContext未释放证书的文件句柄_C#_Asp.net_.net - Fatal编程技术网

C# GetAzureADAppOnlyAuthenticatedContext未释放证书的文件句柄

C# GetAzureADAppOnlyAuthenticatedContext未释放证书的文件句柄,c#,asp.net,.net,C#,Asp.net,.net,我的方法接收base64格式的文件,将其转换为字节数组,然后转换为webappp中的本地文件 然而,我需要删除该文件,因为它是临时的,但我总是得到上面的错误 public async Task<IHttpActionResult> AddGlobalDesignTenant([FromBody]GlobalDesignTenant globaldesigntenant) { var telemetry = new TelemetryClie

我的方法接收base64格式的文件,将其转换为字节数组,然后转换为webappp中的本地文件

然而,我需要删除该文件,因为它是临时的,但我总是得到上面的错误

  public async Task<IHttpActionResult> AddGlobalDesignTenant([FromBody]GlobalDesignTenant globaldesigntenant)
        {
            var telemetry = new TelemetryClient();
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

                string domainUrl = globaldesigntenant.TestSiteCollectionUrl;
                string tenantName = domainUrl.Split('.')[0].Remove(0, 8);
                globaldesigntenant.TenantName = tenantName;

                var globalDesignTenantStore = CosmosStoreHolder.Instance.CosmosStoreGlobalDesignTenant;
                byte[] data = Convert.FromBase64String(globaldesigntenant.base64CertFile);

                if (File.Exists(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx"))
                {
                    File.Delete(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx");
                }

                File.WriteAllBytes(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx", data);
                try
                {
                    using (var cc = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(globaldesigntenant.TestSiteCollectionUrl,
                        globaldesigntenant.Applicationid,
                        globaldesigntenant.TenantName+".onmicrosoft.com",
                        HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx",
                        globaldesigntenant.CertificatePassword))
                    {
                        cc.Load(cc.Web, p => p.Title);
                        cc.ExecuteQuery();
                        Console.WriteLine(cc.Web.Title);
                    }

                }
                catch (Exception ex)
                {
                    return BadRequest("Cant authenticate with those credentials");
                }              


                KeyVaultHelper keyVaultHelperPFX = new KeyVaultHelper();
                await keyVaultHelperPFX.OnCreateAsync("GlobalDesignTenantPFXFileBAse64"+ tenantName, globaldesigntenant.base64CertFile);
                globaldesigntenant.SecretIdentifierBase64PFXFile = keyVaultHelperPFX.SecretIdentifier;


                KeyVaultHelper keyVaultHelperPassword = new KeyVaultHelper();
                await keyVaultHelperPassword.OnCreateAsync("GlobalDesignTenantCertPassword" + tenantName, globaldesigntenant.CertificatePassword);
                globaldesigntenant.SecretIdentifieCertificatePassword = keyVaultHelperPassword.SecretIdentifier;

                globaldesigntenant.CertificatePassword = string.Empty;
                globaldesigntenant.base64CertFile = string.Empty;

                File.Delete(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx");

                var added = await globalDesignTenantStore.AddAsync(globaldesigntenant);
                return Ok(added);
            }
            catch (Exception ex)
            {
                string guid = Guid.NewGuid().ToString();
                var dt = new Dictionary<string, string>
                {
                    { "Error Lulo: ", guid }
                };

                telemetry.TrackException(ex, dt);
                return BadRequest("Error Lulo: " + guid);
            }             
        }
public异步任务AddGlobalDesignTenant([FromBody]GlobalDesignTenant GlobalDesignTenant)
{
var telemetry=新遥测客户端();
尝试
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
字符串domainUrl=globaldesigntenant.TestSiteCollectionUrl;
字符串tenantName=domainUrl.Split('.')[0]。删除(0,8);
globaldesigntenant.TenantName=租户名称;
var globalDesignTenantStore=CosmosStoreHolder.Instance.CosmosStoreGlobalDesignTenant;
字节[]数据=Convert.FromBase64String(globaldesigntenant.base64CertFile);
如果(文件.Exists(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx)))
{
Delete(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx”);
}
文件.writealBytes(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx),数据);
尝试
{
使用(var cc=new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(globaldesigntenant.TestSiteCollectionUrl,
globaldesigntenant.Applicationid,
globaldesigntenant.TenantName+“.onmicrosoft.com”,
HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx“,
globaldesigntenant.CertificatePassword)
{
cc.Load(cc.Web,p=>p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
}
}
捕获(例外情况除外)
{
返回BadRequest(“无法使用这些凭据进行身份验证”);
}              
KeyVaultHelper KeyVaultHelperFX=新的KeyVaultHelper();
等待keyVaultHelperPFX.OnCreateAsync(“GlobalDesignTenantPFXFileBAse64”+tenantName,globaldesigntenant.base64CertFile);
globaldesigntenant.SecretIdentifierBase64PFXFile=keyVaultHelperPFX.secretidentier;
KeyVaultHelper keyVaultHelperPassword=新的KeyVaultHelper();
等待KeyVault HelperPassword.onCreateAync(“GlobalDesignEntantPassword”+租户名称,GlobalDesignEntant.CertificatePassword);
globaldesigntenant.secretIdentificatePassword=keyVault HelperPassword.SecretIdentifier;
globaldesigntenant.CertificatePassword=string.Empty;
globaldesigntenant.base64CertFile=string.Empty;
Delete(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx”);
var added=await globalDesignTenantStore.AddAsync(globaldesigntenant);
返回Ok(已添加);
}
捕获(例外情况除外)
{
字符串guid=guid.NewGuid().ToString();
var dt=新字典
{
{“错误Lulo:,guid}
};
遥测.跟踪异常(ex,dt);
返回BADDREQUEST(“错误Lulo:+guid”);
}             
}

我可能弄错了,但这似乎是个bug

注意下面一行

var certfile = System.IO.File.OpenRead(certificatePath);
这将返回一个
FileStream
,它似乎永远不会关闭或处理

解决方法


首先读取数据(确保您已处理),然后对
GetAzureADAppOnlyAuthenticatedContext

使用其他重载之一。您需要将其分为两个过程,一个是获取数据并将数据写入本地文件,然后在完成此过程后,处理文件对象。第二个过程是删除该临时文件,这样就可以了,因为文件对象已经被释放并且可以访问。您的问题应该是,
GetAzureADAppOnlyAuthenticatedContext
没有释放证书文件的句柄
var certfile = System.IO.File.OpenRead(certificatePath);