我们目前正在开发一个Web应用程序,它依赖于ASP .NET MVC 5,Angular.JS 1.4,Web API 2和Entity Framework 6.出于可伸缩性的原因,Web应用程序的重量依赖于async/await模式.我们的域需要一些cpu密集型计算,这可能需要几秒钟(<10s).在过去,一些团队成员使用Task.Run,以加快计算速度.因为在ASP .NET MVC或Web API控制器中启动一个额外的线程被认为是一种不好的做法(该线程不为IIS所知,所以不是在AppDomain Recycle上考虑=>参见Stephen Cleary的博客文章),他们使用了ConfigureAwait(false).
public async Task CalculateAsync(double param1, double param2)
{
// CalculateSync is synchronous and cpu-intensive (<10s)
await Task.Run(() => this.CalculateSync(param1, param2))).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
由于我必须在我的应用程序中执行大量文件I/O操作,因此我决定异步实现它们.查看MSDN,File.Create,File.Delete和File.Move没有异步对应项.据我所知,原因是不存在用于文件删除,创建或移动的异步Win32实现,所以我最终得到了以下解决方案:
public static Task DeleteAsync(string path)
{
Guard.FileExists(path);
return Task.Run(() => File.Delete(path));
}
public static Task<FileStream> CreateAsync(string path)
{
Guard.IsNotNullOrWhitespace(path);
return Task.Run(() => File.Create(path));
}
public static Task MoveAsync(string sourceFileName, string destFileName)
{
Guard.FileExists(sourceFileName);
Guard.IsNotNullOrWhitespace(destFileName);
return Task.Run(() => { File.Move(sourceFileName, destFileName); });
}
Run Code Online (Sandbox Code Playgroud)
考虑到范例"不要在库中使用Task.Run",我想知道是否有更好的实现或者我应该回退到同步代码?
提前谢谢了!
编辑:
我现在正在解决这个问题2天,我希望这里的任何人都有类似的问题和解决方案.
问题:它是一个Spring MVC(2.5.6.)Web应用程序,它在Tomcat 6中运行.当请求起始页面时,它将客户重定向到JSP页面(通过使用HTML的元刷新标签),它将内容加载到很多Ajax请求(Framework:Prototype).问题是Tomcat为每个AJAX请求创建一个新会话(大约67个会话).我的第一个想法是在加载起始页面之后存储会话Cookie,并且Ajax请求强制Tomcat创建新会话.我的方法是手工创建会话cookie,但这没有任何区别.有趣的是,它可以在其他一些tomcat实例中运行,但不适用于集成测试所需的环境.在我看来,这是一个Tomcat配置问题.
在使用Firebug进一步调查之后,我发现Tomcat为每个请求创建了一个新的Session,即使正确的JSESSIONID被转移到它(50B5EA0BCFE811C744CE9C1F9EDE0097):
Request Header 1:
Cookie JSESSIONID=F3206CBF2C961E125821FF22FA31A02D
Response Header 1:
Set-Cookie JSESSIONID=49E000B4D6880F4F94531AB9C78DB667; Path=/JOCA-Music-Portal JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097; Path=/JOCA-Music-Portal
Request Header 2:
Cookie JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097
Response Header 2:
Set-Cookie JSESSIONID=DCCA2D1B98D11223A6B8855800276E27; Path=/JOCA-Music-Portal
Run Code Online (Sandbox Code Playgroud)
更新:进一步调查将问题隔离到Tomcat领域配置.我们使用JDBC Realm进行登录.当登录被取消激活时,只创建一个会话.如果它被激活,Tomcat会创建无效/过期的会话,这就是为每个请求创建一个新会话的原因.但为什么Tomcat表现得像这样呢?
我真的很绝望,所以任何想法/提示/解决方案都很受欢迎.
非常感谢你
我正在寻找一种避免内存会话复制/群集的方法,并将会话存储在数据库中.此时使用Tomcat的JDBCStore是无用的,因为它只在数据库中存储非活动会话以保存服务器内存.有什么建议?
非常感谢Fabian
我们目前正在使用Web API 2和.NET 4.5.2构建RESTful服务.该服务利用OWIN自托管,使用Topshelf嵌入在Windows服务中.为了进行身份验证,客户端必须提供客户端证书(X509).到目前为止我们找到的所有文档都使用IIS来设置客户端证书身份验证
在使用OWIN自托管而不是IIS时,是否有通过证书进行身份验证的正确方法?
提前谢谢了.
c# client-certificates asp.net-web-api owin asp.net-web-api2
c# ×3
async-await ×2
tomcat ×2
ajax ×1
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
io ×1
java ×1
jdbc ×1
owin ×1
replication ×1
servlets ×1
session ×1
spring ×1