首页 \ 问答 \ ASP.NET MVC同步与异步WCF调用(ASP.NET MVC Synchronous vs Asynchronous WCF calls)

ASP.NET MVC同步与异步WCF调用(ASP.NET MVC Synchronous vs Asynchronous WCF calls)

我正在开发一个ASP.NET MVC,它通过WCF服务完全加载它的数据。 我的模型只是调用WCF服务。 然后控制器将模型传递给视图。 我在这篇文章中读到,如果可以,最好做异步调用。 但是我仍然不确定使用哪个电话。 如果构成服务的数据需要一段时间才能加载会发生什么? 这是否意味着我的控制器代码将继续运行,如果达到return语句时数据不存在,我的控制器将返回一个空视图,由于视图访问未填充的模型字段,这也可能导致空指针异常?


I working on an ASP.NET MVC which is loading its data completely via a WCF service. What my model does is just call the WCF service. The controller then passes the model to the view. I read in this article that it is always better to do async calls if you can. However I am still not sure which call to use. What would happen if the data form the service takes a while to load? Does it mean that my controller code will keep running and if the data is not there when the return statement is reached my controller will return an empty view, which could also cause a null pointer exception because of the view accessing unpopulated model fields?


原文:https://stackoverflow.com/questions/24545985
更新时间:2020-10-17 07:10

最满意答案

如果您的控制器返回任务,那么您将没事。 如果您使用的是C#5.0,则可以使用async / await使代码比文章中显示的更易于维护。 基本上你的代码看起来像这样

public async Task<ActionResult> SomeAction()
{
    var someData = await wcfServiceProxy.GetDataAsync() //alternatively an async call to your model service which should also be async
    //some work with the data here
    return View(someData);
}

或者您可以不关心并使用所有同步调用。 使用同步调用的缺点是您的吞吐量会受到影响。 您将能够每秒处理200个请求,而不是每秒50K请求(我正在凭空消除这些数字)。 当然,在大多数情况下,您根本不关心,因为您的项目每秒不会超过20个请求。


If your controller returns a Task then you will be fine. If you are on C# 5.0 you can use async/await to make your code more maintainable than what is shown in the article. Basically your code will look like this

public async Task<ActionResult> SomeAction()
{
    var someData = await wcfServiceProxy.GetDataAsync() //alternatively an async call to your model service which should also be async
    //some work with the data here
    return View(someData);
}

or you can just not care and use all synchronous calls. The downside of using synchronous calls is that your throughput would suffer. You will be able to handle 200 requests per second instead of 50K requests per second (and I am pulling these numbers out of thin air). Of course in most cases you simply don't care because your project never does more than 20 requests per second.

2014-07-03

相关问答

更多

ASP.NET MVC依赖注入Unity与WCF服务 - 工作示例解决方案(ASP.NET MVC Dependency Injection Unity with WCF services - working sample solution)

听起来你已经注入了使用Unity的MVC控制器,并且你想要做的就是开始注入你所托管的WCF服务。 要注入WCF服务,您需要使用IInstanceProvider 。 完整的工作解决方案如下: http://orand.blogspot.com/2006/10/wcf-service-dependency-injection.html 你需要4个非常非常简单的类: MyServiceHostFactory MyServiceHost DependencyInjectionServiceBehav ...

在ASP.Net MVC中禁用每个请求的会话状态(Disable Session state per-request in ASP.Net MVC)

为什么不实现一个RouteHandler呢? 这是交易 - IRouteHandler有一个方法 - GetHttpHandler 。 当您向控制器发出ASP.Net MVC请求时,默认情况下,路由引擎通过创建一个新的MvcRouteHandler实例来处理该请求,该实例返回一个MvcHandler 。 MvcHandler是IHttpHandler一个实现,它标有(惊喜!) IRequiresSessionState接口。 这就是正常请求使用Session的原因。 如果您关注如何实现自定义Rou ...

ASP.NET MVC从异步调用重定向(ASP.NET MVC redirect from asynchronous call)

如果您正在执行AJAX调用,那么重定向用户的唯一方法是根据成功的JSON代码更改完整回调中的window.location.href 。 If you are performing an AJAX call, then the only way to redirect the user is to change the window.location.href in the complete callback based on the success JSON code.

异步Asp.Net MVC控制器方法?(Asynchronous Asp.Net MVC controller methods?)

如果长期运行控制器方法不是异步的,那么它们会阻塞其他方法吗? 首先要注意的是,所有这些控制器操作都不应具有对Session的写访问权。 如果他们向会话写入是同步还是异步,则它们将始终按顺序执行,而不是并行执行。 这是因为ASP.NET Session不是线程安全的,如果来自同一会话的多个请求到达,它们将排队。 如果您只是从会话中读取,则可以。 现在,慢速控制器操作不会阻止快速控制器操作。 无论它们是否同步。 对于长控制器操作,只有在使用异步ADO.NET方法访问数据库并因此受益于I / O完成端口 ...

Asp.Net MVC,WebApi和正确的异步方法(Asp.Net MVC, WebApi and Correct Asynchronous Approach)

标准规则之一是不在ASP.NET上使用Task.Run 。 相反,您应该使用自然异步API。 例如,在您的WebAPI中,假设您使用的是EF6: public async Task<IEnumerable<NewsCategoryDto>> GetNewsCategoriesWithRecentNews(int count) { using (var UoW = new UnitOfWork()) { List<NewsCategoryDto> returnList = new L ...

asp.net mvc应该调用wcf(asp.net mvc should calls wcf)

您可以添加服务引用到您的MVC应用程序,并使用代理,就像您在WPF应用程序中一样。 You can just add a Service Reference to your MVC application and use the proxy just as you would in your WPF app.

WCF RIA和ASP.NET MVC 3(WCF RIA And ASP.NET MVC 3)

WCF RIA Services与Silverlight配合使用。 所以你只需要在某个地方托管你的SL应用程序,一个静态的HTML页面可以很好地工作。 你真的不需要ASP.NET MVC。 WCF RIA Services work great with Silverlight. So you just need to host your SL application somewhere, a static HTML page could work just great. You don't re ...

使用asp.net mvc调用异步操作(Asynchoronous action calls with asp.net mvc)

JQuery对此非常有用。 如果您或您的公司有任何第三方控件,例如Telerik RadControls for ASP.NET,您也可以试一试。 我认为他们现在可免费试用。 但是,最好的起点始终是查看已存在的代码。 整个网络上还有大量的AJAX和MVC的例子。 Nikhil Kothari的例子 大卫海登的例子1 大卫海登的例子2 斯科特汉塞尔曼的例子 去下载ScottGu ,ScottHa等为他们的书工作的NerdDinner示例。 JQuery is definitely useful fo ...

为什么在ASP.NET MVC中使用JsonResult时使用WCF REST?(Why use WCF REST when you have JsonResult in ASP.NET MVC?)

在你的情况下,我会使用MVC来实现我的REST,但要回答你的问题: MVC ASP.Net仅构建为HTTP。 REST不是。 代表性状态转移(REST)虽然通常通过HTTP定义, 但不限于HTTP 。 WCF允许您通过非HTTP连接进行通信。 除此之外,我同意在MVC中实现REST更简单,更健壮,特别是在新的MVC Web API中,但是也说,REST在WCF中也占有一席之地,因为WCF可以独立使用HTTP。 编辑:另外应该注意的是,WCF可以在没有IIS的情况下独立存在。 In your cas ...

ASP.NET MVC同步与异步WCF调用(ASP.NET MVC Synchronous vs Asynchronous WCF calls)

如果您的控制器返回任务,那么您将没事。 如果您使用的是C#5.0,则可以使用async / await使代码比文章中显示的更易于维护。 基本上你的代码看起来像这样 public async Task<ActionResult> SomeAction() { var someData = await wcfServiceProxy.GetDataAsync() //alternatively an async call to your model service which should a ...

相关文章

更多

最新问答

更多
  • Haml + ActionMailer - Rails?(Haml + ActionMailer - Rails?)
  • 将数据从div标签传递到javascript函数[关闭](Pass data from div tags to javascript function [closed])
  • 如何使用imaplib创建电子邮件并将其发送到特定邮箱(How to create an email and send it to specific mailbox with imaplib)
  • Ruby - 使用`require`命令(Ruby - working with `require` command)
  • 用ng值检索时,在md-input-container中隐藏输入文本字段的值(label hiding input text field value in md-input-container when retrieving with ng-value)
  • 以编程方式将字符串宽度值插入sprintf()(Programmatically insert string width value into sprintf())
  • Matplotlib计算给定字符串的轴坐标范围(Matplotlib Calculate Axis Coordinate Extents Given String)
  • 在同一个流连接上返回多个结果以实现HTML5 Server Sent Events(Returning multiple results on the same stream connection to implement HTML5 Server Sent Events)
  • 限制对特定URL的访问(Apache Tomcat)(Restrict access to specific URL (Apache Tomcat))
  • R中的时间序列与ggplot2(Time Series in R with ggplot2)
  • 自动URL参数编码失败(Automatic URL Parameter Encoding Failing)
  • 是否有任何关于JRuby + Clojure集成的开源示例?(Are there any good open source examples of JRuby + Clojure integration?)
  • ActiveX被认为是旧的/过时的标准吗?(Is ActiveX considered old/outdated by todays standards?)
  • SQL Server中的XML查询(XML Query within SQL Server)
  • PL / SQL:在更新尝试时,删除导致unique_violation异常的行(PL/SQL: on update attempt, delete row which causes unique_violation exception)
  • webpack css-loader localIdent名称哈希长度(webpack css-loader localIdent name hash length)
  • 基诺数解析器(Keno number parser)
  • R:索引数据框列的名称范围(R: Index data frame columns by ranges of their names)
  • 限制ASP .net和Javascript中的多个事件(Restrict multiple events in ASP .net & Javascript)
  • 更改行时SQL查询不更新表(SQL query not updating table when row is changed)
  • JavaScript,document.getElementById不从窗体中抓取?(JavaScript, document.getElementById not grabbing from form?)
  • h2数据库上的Mybatis无法插入数据(Mybatis on h2 database can't insert data)
  • KeyboardWillHideNotification未在iOS 9中触发(KeyboardWillHideNotification not firing in iOS 9)
  • jQuery UI Droppable - 如何实际更改HTML?(jQuery UI Droppable - How to actually change the HTML?)
  • 无法将APK安装到root设备中(Can't install APK into rooted device)
  • 在滚动浏览器时,使jQuery UI对话框不改变它的位置(相对于浏览器)(make jQuery UI dialog not change it's position (relative to the browser) when scrolling browser)
  • 我们可以在NativeScript中使用nedb吗?(Can we use nedb with NativeScript?)
  • 使用CancellationToken的竞争条件,其中CancellationTokenSource仅在主线程上被取消(Race condition with CancellationToken where CancellationTokenSource is only cancelled on the main thread)
  • 使用Framework7从JS更新HTML视图中的数据(Update data in HTML view from JS using Framework7)
  • sql server:选择一个外键为NULL的字段(sql server: select a NULL field that is foreign key)