小编Sha*_*ser的帖子

ASP.NET MVC 4异步子操作

我有一个针对.NET 4.5的ASP.NET MVC 4应用程序.我们的一个子操作使用HttpClient调用Web服务.

由于我们阻止IO等待HttpClient响应,因此将代码转换为async/await模式非常有意义.但是,当MVC 4尝试执行子操作时,我们收到以下错误消息:

HttpServerUtility.Execute在等待异步操作完成时被阻塞.

乍一看,似乎MVC 4不支持子动作中的异步/等待.唯一剩下的选项是使用同步代码运行并在异步任务上强制"等待".

众所周知,在ASP.NET上下文中的异步任务上触摸.Result或.Wait()会导致立即死锁.我的异步逻辑包含在类库中,所以我不能使用"await blah.ConfigureAwait(false)"技巧.请记住,在子操作上标记"async"并使用await会导致错误,这会阻止我配置await.

此刻我被画成一个角落.有没有办法在MVC 4子操作中使用异步方法?看起来像一个没有解决方法的平坦的bug.

asp.net-mvc async-await asp.net-mvc-4

28
推荐指数
2
解决办法
1万
查看次数

HttpWebRequest:请求已中止:请求已取消

我一直致力于开发一种中间人应用程序,它使用一系列日期的HTTP发布请求(通常一次只有7个)将文本上传到CMS后端.我正在使用HttpWebRequest来实现这一目标.它似乎在第一个日期工作正常,但是当它开始第二个日期时,我得到System.Net.WebException:请求被中止:请求被取消.

我四处搜寻,发现了以下重要线索:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/0d0afe40-c62a-4089-9d8b-fb4d206434dc

http://www.jaxidian.org/update/2007/05/05/8

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

他们并没有太多帮助.我已经尝试重载GetWebReuqest,但这没有意义,因为我没有使用该函数.

这是我的代码:http: //pastebin.org/115268

在成功运行至少一次后,我在第245行得到错误.

我很感激我能得到的任何帮助,因为这是我一直在努力的项目的最后一步.这是我的第一个C#/ VS项目,所以我对任何提示持开放态度,但我想专注于首先解决这个问题.

谢谢!

c# httpwebrequest visual-studio-2008

22
推荐指数
2
解决办法
6万
查看次数

在没有竞争条件的情况下使用Entity Framework实现if-not-exists-insert

使用LINQ-to-Entities 4.0,是否有正确的模式或结构来安全地实现"if not exists then insert"?

例如,我目前有一个跟踪"用户收藏夹"的表 - 用户可以在收藏夹列表中添加或删除文章.

基础表不是真正的多对多关系,而是跟踪一些其他信息,例如添加收藏夹的日期.

CREATE TABLE UserFavorite
(
    FavoriteId int not null identity(1,1) primary key,
    UserId int not null,
    ArticleId int not null
);

CREATE UNIQUE INDEX IX_UserFavorite_1 ON UserFavorite (UserId, ArticleId);
Run Code Online (Sandbox Code Playgroud)

根据需要,使用相同的用户/文章对插入两个收藏夹会导致重复键错误.

我目前使用C#在数据层中实现了"if not exists then insert"逻辑:

if (!entities.FavoriteArticles.Any(
        f => f.UserId == userId && 
        f.ArticleId == articleId))
{
    FavoriteArticle favorite = new FavoriteArticle();
    favorite.UserId = userId;
    favorite.ArticleId = articleId;
    favorite.DateAdded = DateTime.Now;

    Entities.AddToFavoriteArticles(favorite);
    Entities.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这种实现的问题在于它易受竞争条件的影响.例如,如果用户双击"添加到收藏夹"链接,则可以将两个请求发送到服务器.第一个请求成功,而第二个请求(用户看到的请求)失败,UpdateException包含重复键错误的SqlException.

使用T-SQL存储过程,我可以使用具有锁定提示的事务来确保永远不会发生竞争条件.是否有一种干净的方法来避免实体框架中的竞争条件,而不诉诸存储过程或盲目吞咽异常?

linq-to-entities entity-framework insert

15
推荐指数
1
解决办法
6840
查看次数

ASP.NET MVC"有潜在危险的Request.Path",带有效URL

在我的生产ASP.NET MVC 3站点上,我注意到偶尔会出现"从客户端检测到一个潜在危险的Request.Path值(%)".Windows应用程序日志中的未处理异常.

虽然这些在常规站点使用(即/随机web机器人)下完全有效,但许多请求似乎来自有效的本地ISP用户.

在例外的请求详细信息中,请求URL与请求路径不同:

请求URL:http://www.somesite.com/Images/Image With Space.jpg

请求路径:/Images/Imagehttp://www.somesite.com/Images/Image With Space.jpgWithhttp://www.somesite.com/Images/Image With Space.jpgSpace.jpg

请注意,在"请求路径"中,路径中存在"空格"的任何位置都会替换为请求URL的精确副本!

在网站内,实际链接如下所示:

<img src="/Images/Image%20With%20Space.jpg" />
Run Code Online (Sandbox Code Playgroud)

知道可能导致这种情况的原因吗?我试着查看Request.Path和Request.Url的文档,但我无法弄清楚为什么它们会有所不同.直接命中请求URL会正确显示资源.

更新:我设法通过使用IIS 7.0的失败请求跟踪功能来查看其中一个故障请求:

推荐人:谷歌搜索

用户代理:Mozilla/5.0(iPad; CPU OS 5_1_1,如Mac OS X)AppleWebKit/534.46(KHTML,如Gecko)版本/ 5.1 Mobile/9B206 Safari/7534.48.3

RequestURL:http://www.somesite.com:80/Images/Image%20With%20Space.jpg

手动将URL键入我的iOS 5.1.1会正确显示图像.在Google图像中搜索图像会正确显示图像.仍然没有成功的复制.

在路径的中途,我看到:

MODULE_SET_RESPONSE_ERROR_STATUS警告.ModuleName ="RequestFilteringModule",Notification ="BEGIN_REQUEST",HttpStatus ="404",HttpReason ="Not Found",HttpSubStatus ="11",

根据IIS的文档,来自请求过滤模块的404.11是URL中的"双重编码"错误.尝试一下,如果我有目的地创建一个双重编码的URL,如http://www.somesite.com/Images/Image%2520With%2520Space.jpg,我会在事件日志中得到确切的错误,并填写格式错误的请求路径.

事件日志错误中格式错误的请求路径似乎是ASP.NET 4.0中的错误.

但是,它没有解释为什么我首先得到错误.我检查了大量失败的请求日志 - 唯一的常见因素是他们都在使用AppleWebKit.它可能是Safari中的一个错误吗?

iis-7 asp.net-mvc-3 requestfiltering

5
推荐指数
1
解决办法
5052
查看次数

为构建服务器自定义Visual Studio 2012的Web发布管道(WPP)

我正在为大型企业服务基础架构创建构建和部署基础架构.我们将Build Server用于构建服务器,Visual Studio 2012用于生成WPP部署包,MSDeploy 2.1用于执行实际部署.(我们不能使用MSDeploy 3,因为它有很多错误 - 使用WMSvc等破坏了NTLM身份验证).

我创建了一个"Project.wpp.targets"文件并添加了以下属性:

<DeployOnBuild Condition="$(DeployOnBuild) == '' And '$(OutDir)' != '$(OutputPath)' ">true</DeployOnBuild>
<WebPublishMethod>Package</WebPublishMethod>
<DeployManagedPipelineMode>Integrated</DeployManagedPipelineMode>
<Disable_CopyWebApplication>True</Disable_CopyWebApplication>
Run Code Online (Sandbox Code Playgroud)

当编译在构建服务器上发生时,OutDir将与OutputPath不同,并且将激活WPP.构建输出以下文件:

Project.zip
Project.SetParameters.xml
Project.SourceManifest.xml
Project.deploy.cmd
Project.deploy-readme.txt
Run Code Online (Sandbox Code Playgroud)

project.zip里面是:

Archive.xml
Parameters.xml
systemInfo.xml
Run Code Online (Sandbox Code Playgroud)

问题1 - 什么是SourceManifest.xml文件,为什么它不在zip包中?似乎为部署创建zip文件包的全部原因是它完全自包含.SourceManifest文件是"松散的" - 我们不能再将zip文件放在我们的部署文件共享上了.为什么不在包中?它还指向构建服务器上的特定路径!

问题2 - 什么是Archive.xml文件?对SourceManifest.xml来说似乎有些多余 - 我看到了一个提供者,一些提供者等.在Microsoft文档中,他们在包中提到了"manifest.xml".此文件看起来像清单,但它被称为"archive.xml".文件名是否重要?manifest.xml与archive.xml不同吗?它们如何与SourceManifest.xml相关,它看起来类似但同时又不同?

问题3 - systemInfo.xml是什么?它似乎列出了在构建服务器上为IIS角色安装的所有组件.例如,如果我在本地计算机上运行build at命令行,它会列出已安装.NET 2.0和4.0以及我机器上各种IIS组件的许多True/False值.问题是这些设置与我实际想要部署的内容无关!MSDeploy是否会查看此文件?它可以被禁用吗?我绝对不希望构建服务器的配置工件影响生产!

tfsbuild msdeploy visual-studio-2012 msbuild-wpp

4
推荐指数
1
解决办法
1204
查看次数