在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件.文件上传后,我需要立即启动该文件的异步处理并将响应返回给浏览器,而无需等待处理完成.
显然我可以手动启动一个新线程来处理文件,但我想知道是否可以使用.net 4.5引入的async/await机制来实现这个场景
为了测试这个概念,我尝试过这样的事情:
public async Task<ActionResult> Test()
{
TestAsync();
return View("Test");
}
public async void TestAsync()
{
await LongRunning();
}
private Task<int> LongRunning()
{
return Task<int>.Factory.StartNew(() => Pause());
}
private int Pause()
{
Thread.Sleep(10000);
return 3;
}
Run Code Online (Sandbox Code Playgroud)
异步机制似乎一般工作:当我调试代码时,我点击"返回视图("测试");" 行"返回3"之前的行.但是,浏览器仅在Pause方法完成后才会收到响应.
这看起来像常规异步控制器(具有Async和Completed方法的控制器).有没有办法在控制器中为我的场景使用async/await?
目前,我有一个Service Fabric集群,其中包含两个托管Asp Web API的无状态服务.在创建群集时,还会创建适当的Azure负载均衡器.
现在我想在我的集群前添加Application Gateway,原因有很多,比如SSL卸载,url-routing等.
我想了解如何正确配置Application Gateway.我看到2个选项,不确定哪个有效:
哪一个是正确的?任何建议如何配置?
我有以下html:
<div data-bind="foreach: Contacts">
<a data-bind="click: $parent.Foo($data), text: Name">link</a>
</div>
<button data-bind="click: AddContacts">click</button>
Run Code Online (Sandbox Code Playgroud)
和js代码:
var viewModel = ko.mapping.fromJS({"Selected":null,"Contacts":[]});
viewModel.AddContacts = function(){
this.Contacts([{"Name":"C1"},{"Name":"C2"}]);
}
viewModel.Foo = function (contact) {
alert(contact.Name);
}
ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,会为每个联系人调用Foo.在点击任何链接之前,我根本没想到会调用它.
我正在开发一个示例Service Fabric项目,我必须维护一个购物清单.为此我有一个ShoppingList actor,可以通过特定的id识别.它使用StateManager将当前列表内容存储在其状态中.一切正常.
但是,与此同时,我想在sql数据库中维护购物清单内容.特别是:
实现这一目标的最佳方法是什么?创建一个自定义StateProvider(如何?找不到示例)?或者可能有另一个服务/ actor来处理所有数据库操作(可能使用队列和提醒)?
所有示例似乎完全依赖于默认的StateManager,没有数据持久性到外部存储,所以我不确定什么是最佳实践.
我有一个使用OpenXML SDK读取和写入Excel(xlsx)单元格的类.该课程基于此处最多投票的答案:Open XML SDK 2.0 - 如何更新电子表格中的单元格?
我需要更新一个单元格,然后获取另一个单元格的值,其中包含一个计算公式.更新工作正常,但是当我在更新后读取公式单元格时,我得到旧值,在编辑之前存在于doc中.但是,当我在运行程序后手动打开我的xlsx时,我可以看到正确的值.
所以看起来像单元格的旧值被缓存在某个地方......这很奇怪,因为我每次在读/写单元格之前打开/关闭我的文档.
编辑:文森特的回答让我更新了我的示例代码.我添加了一个Refresh方法,可以在后台运行的Excel应用程序中打开,保存和关闭文档.这会重新计算我的公式.有关更多详细信息和C#代码示例,请参阅:http://fczaja.blogspot.com/2013/05/how-to-read-and-write-excel-cells-with.html
是否可以将ViewModel对象传递给WebApi控制器操作而不是单独的参数?
而不是使用:
public class ContactsController : ApiController
{
public IEnumerable<Contact> GetContacts(string p1, string p2)
{
// some logic
}
}
Run Code Online (Sandbox Code Playgroud)
我想用:
public class ContactsController : ApiController
{
public IEnumerable<Contact> GetContacts(TestVM testVM)
{
// some logic
}
}
public class TestVM
{
public string P1 { get; set; }
public string P2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎不起作用.当我调用/ api/contacts /?P1 = aaa&P2 = bbb时,testVM对象不会被填充(null).
另外,我希望TestVM定义了valdiation属性,并在我的API控制器中使用ModelState.IsValid.
我正在使用svcutil生成的OrganizationServiceContext实现来从CRM中检索实体:
context.new_productSet.First(p => p.new_name == "Product 1");
Run Code Online (Sandbox Code Playgroud)
是否可以一次检索具有不同属性值的多个实体 - (像SQL中的IN运算符一样)?
示例:我想通过一次调用检索多个产品("产品1","产品2",...).产品名称列表是动态的,存储在名为productNames的数组中.
我有一个WPF ViewModel,它有一个命令打开一个File对话框,如下所示:
var dlg = new OpenFileDialog();
var result = dlg.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
现在我想对该命令进行单元测试.ShowDialog是一个继承自CommonDialog的方法,所以我假设我可以像这样填充它:
Microsoft.Win32.Fakes.ShimCommonDialog.AllInstances.ShowDialog = () => true;
Run Code Online (Sandbox Code Playgroud)
但我收到以下编译错误:
Delegate
Microsoft.QualityTools.Testing.Fakes.FakesDelegates.Func<Microsoft.Win32.CommonDialog,bool?>不接受0个参数
有任何想法吗?
c# ×2
.net-4.5 ×1
async-await ×1
asynchronous ×1
azure ×1
dynamics-crm ×1
excel ×1
knockout.js ×1
openxml ×1
openxml-sdk ×1
unit-testing ×1