小编fil*_*lip的帖子

操作完成前MVC4 + async/await +返回响应

在我的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?

c# asynchronous async-await asp.net-mvc-4 .net-4.5

16
推荐指数
1
解决办法
7425
查看次数

带有Service Fabric的Azure应用程序网关

目前,我有一个Service Fabric集群,其中包含两个托管Asp Web API的无状态服务.在创建群集时,还会创建适当的Azure负载均衡器.

现在我想在我的集群前添加Application Gateway,原因有很多,比如SSL卸载,url-routing等.

我想了解如何正确配置Application Gateway.我看到2个选项,不确定哪个有效:

  • Application Gateway取代现有的Load Balancer并直接指向托管WebApi的SF服务
  • 我将现有的LB配置和Application Gateway指向此LB(看起来像1 LB解决方案太多)

哪一个是正确的?任何建议如何配置?

azure azure-service-fabric azure-application-gateway

15
推荐指数
2
解决办法
3556
查看次数

单击foreach中的父函数绑定

我有以下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.在点击任何链接之前,我根本没想到会调用它.

knockout.js

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

Service Fabric Actors - 将状态保存到数据库

我正在开发一个示例Service Fabric项目,我必须维护一个购物清单.为此我有一个ShoppingList actor,可以通过特定的id识别.它使用StateManager将当前列表内容存储在其状态中.一切正常.

但是,与此同时,我想在sql数据库中维护购物清单内容.特别是:

  • 存储所有添加/删除项目请求以供将来分析(ML)
  • 在第一个actor初始化加载列表内容来自db(例如,在重新创建集群之后)

实现这一目标的最佳方法是什么?创建一个自定义StateProvider(如何?找不到示例)?或者可能有另一个服务/ actor来处理所有数据库操作(可能使用队列和提醒)?

所有示例似乎完全依赖于默认的StateManager,没有数据持久性到外部存储,所以我不确定什么是最佳实践.

azure-service-fabric

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

OpenXML - 在单元格更新后刷新Excel表格

我有一个使用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

excel openxml excel-formula openxml-sdk

3
推荐指数
1
解决办法
3901
查看次数

将ViewModel传递给Web-Api操作

是否可以将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.

asp.net-web-api

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

Dynamics CRM SDK - 带有OrganizationServiceContext的linq的IN运算符

我正在使用svcutil生成的OrganizationServiceContext实现来从CRM中检索实体:

context.new_productSet.First(p => p.new_name == "Product 1");
Run Code Online (Sandbox Code Playgroud)

是否可以一次检索具有不同属性值的多个实体 - (像SQL中的IN运算符一样)?

示例:我想通过一次调用检索多个产品("产品1","产品2",...).产品名称列表是动态的,存储在名为productNames的数组中.

dynamics-crm dynamics-crm-2011

2
推荐指数
2
解决办法
3677
查看次数

如何填充OpenFileDialog.ShowDialog方法

我有一个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# unit-testing microsoft-fakes

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