ASP.NET Web API 从 MVC 4 控制器失败
Posted
技术标签:
【中文标题】ASP.NET Web API 从 MVC 4 控制器失败【英文标题】:ASP.NET WebAPI fails from MVC4 controller 【发布时间】:2012-09-04 12:27:29 【问题描述】:我是 ASP.NET Web API 的新手,遇到了一个非常奇怪的问题。
我有一些调用 RESTful 服务的代码,它可以在控制台项目中正常执行,但我无法在 .NET 4.0 下运行的 MVC4 项目中运行它
调用服务的代码很简单:
internal string Test()
using (var client = new HttpClient())
client.BaseAddress = new Uri("https://testserver");
var task = client.GetAsync("/someUri")
var response = task.Result;
response.EnsureSuccessStatusCode();
return response.Content.ReadAsStringAsync().Result;
如前所述,从控制台项目调用它按预期工作,我会在几毫秒内得到响应,但是如果我在几秒钟后从 MVC4 控制器中的操作调用该方法,我会收到一条消息,指出: “连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应”。
奇怪的是,在调试MVC4版本时,任务状态总是显示为WaitingForActivation。
运行 fiddler 不会显示来自 MVC4 版本的任何请求,但对于控制台版本再次显示。
经过相当认真的谷歌搜索后,我找不到其他人似乎有这个问题,所以我猜我从根本上误解了一些东西,但目前我不确定是什么!
2012 年 11 月 9 日英国夏令时 16:55 更新
为了让事情变得更奇怪,我刚刚创建了一个新的 MVC4 站点,我可以毫无问题地调用该方法!我现在正在尝试比较这些站点,但是一个是升级到 MVC4 的现有站点,另一个是一个新的空白站点,因此发现相关差异可能很棘手。
2012 年 9 月 14 日英国夏令时 16:44 更新
这现在看起来像是一些基础架构/网络问题。
我使用 .NET 4.5 将项目升级到 VS2012,以便我可以使用 async/await 来尝试建议的实现以避免死锁。这并没有改变任何东西,所以我回到了第 1 格。
我创建了一个新的解决方案,其中包含一个新的 MVC4 项目、一个新的服务库和一个单元测试项目,用于在 MVC 之外运行服务库。
在服务库中,我创建了一种方法来调用公共的“我的 IP 是什么”服务,另一种方法是调用公开但仅正确响应公司 IP 地址的公司服务。
出于某些背景,我通过 *** 连接到公司 LAN。
当与 *** 断开连接时,在单元测试和 MVC 中,IP 服务响应 HTTP 200,公司服务按预期响应 HTTP 404。
连接到 *** 时,单元测试都响应 HTTP 200,MVC 都超时。
接下来,我在本地运行 MS Soap Tool,并使用它来代理对公司服务的调用。所有调用(无论是来自单元测试还是 MVC)都会显示请求和响应,但单元测试会注册响应,而 MVC 控制器不会。
我唯一的另一个想法是这可能与回复的大小有关?除了单元测试调用公司服务之外,所有的“成功”都有非常小的回复?
【问题讨论】:
我怀疑您的代码中存在死锁。查看以下内容:nitoprograms.blogspot.com/2012/07/dont-block-on-async-code.html 听起来很有希望,我会尝试该博客的建议。谢谢 好的,那篇博文中的细节肯定很有趣,但是博文和任何链接文章中的解决方案仅适用于 .NET 4.5。我也很困惑为什么一个新的 MVC4 网站没有出现同样的问题。 您是否可以将其缩小为仅包含此操作的简单项目并将其上传到某处以便我查看? 不幸的是,在一个简单的项目中这不是问题。我试图缩小导致它破裂的原因,但我怀疑一旦我知道是哪个部分导致它破裂,那会给我答案:) 【参考方案1】:Microsoft 推荐的将 MVC3 站点升级到 MVC4 站点的方法是从一个全新的 MVC4 站点开始,然后迁移您的视图、控制器和代码。所以我认为您的升级步骤可能是您的问题的一部分,因为您能够让它在您创建的新 MVC4 站点中工作。如果您需要手动升级现有站点,我会按照Upgrading ASP.NET MVC 3 Project to ASP.NET MVC 4 中列出的步骤进行操作
【讨论】:
嗨 Paige,是的,您链接的那些步骤是执行升级所遵循的步骤。 然后我会尝试按照第一个选项将所有视图、控制器和代码迁移到工作的 MVC4 站点。 刚刚尝试过,在迁移所有视图、控制器和代码后,新的 MVC4 站点也停止工作...... 然后您需要重新开始并一次迁移一个部分(可能由控制器),以查看问题出现在哪里。另外,从现有站点检查您的路由设置,可能是其中的东西。以上是关于ASP.NET Web API 从 MVC 4 控制器失败的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 4 / MVVM / Web API 的良好结构? [关闭]
ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?