使用异步时文件写入问题

问题描述 投票:0回答:1

我有一个像下面这样的函数将文件写入logfile:

private async Task<string> GetResponseString(string test)
{        
    var response = await client.PostAsync("https://something/api/apimethod"....);        
    ProcessWrite("C:\\"log.txt","some text to write").Wait();        
}

static Task ProcessWrite(string filePath,string text)
{
    return WriteTextAsync(filepath,text);
}

static async Task WriteTextAsync(string filePath,string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath,
            FileMode.Append, FileAccess.Write, FileShare.ReadWrite,
            bufferSize: 4096, useAsync: true))
    {

            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };

}

它用于编写文件,当我在Visual Studio中运行时,我能够编写该文件,但是当我在IIS Web服务器中部署它时。然后将内容写入文件停止工作。但没有例外。

如何在部署日志时写日志?

c# .net asp.net-web-api async-await
1个回答
0
投票

以下是我的计算机上的IIS应用程序池的标准快照,即我的IIS版本 - 10.0

enter image description here

由于它显示所有应用程序池默认具有与ApplicationPoolIdentity关联的唯一匿名用户,现在您有两个选项:

选项1:

设置相关应用程序池的权限,使用ICACLS命令,更多细节herehere,下面是一个例子,有很多微调选项

ICACLS "C:" /grant "IIS AppPool\DefaultAppPool":F /t

或者您甚至可以将任何其他相关应用程序池的DefaultAppPoolor添加到具有权限或Windows资源管理器中的目录权限的任何相关组,它们将被自动识别并且将被许可用于关联的ApplicationPoolIdentity

选项2:

在同一个快照中,有一个带有域帐户的应用程序池,可以从高级设置更改,如下面的快照:

enter image description here

在这里,您可以添加具有访问文件系统权限的用户,从安全角度来看,这是我更喜欢的

还请修理一下:

ProcessWrite("C:\\"log.txt","some text to write").Wait()

应该

await ProcessWrite("C:\\"log.txt","some text to write")

Task.Wait可以阻止对ASP.Net的调用,导致死锁和使异步调用使用await <Method Name>的理想方法

© www.soinside.com 2019 - 2024. All rights reserved.