小编Dan*_*anH的帖子

CreatedAtRoute路由到不同的控制器

我正在使用属性路由创建一个新的webapi来创建嵌套路由,如下所示:

    // PUT: api/Channels/5/Messages
    [ResponseType(typeof(void))]
    [Route("api/channels/{id}/messages")]
    public async Task<IHttpActionResult> PostChannelMessage(int id, Message message)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != message.ChannelId)
        {
            return BadRequest();
        }

        db.Messages.Add(message);
        await db.SaveChangesAsync();

        return CreatedAtRoute("DefaultApi", new { id = message.Id }, message);
    }
Run Code Online (Sandbox Code Playgroud)

但是我想返回一个没有嵌套的路由,即:

/api/Messages/{id}
Run Code Online (Sandbox Code Playgroud)

这是在消息控制器上定义的.但是,上面的CreatedAtRoute调用不解析此路线而是抛出.我做错了什么,或者它不支持路由到不同的api控制器?我试图点击的路线不是属性路线,只是默认路线.

例外是:

消息:"发生了错误." ExceptionMessage:"UrlHelper.Link不能返回null." ExceptionType:"System.InvalidOperationException"StackTrace:"at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult 1.Execute() at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult1.ExecuteAsync(CancellationToken cancellationToken)at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()---堆栈跟踪结束从抛出异常的上一个位置---在System.Runtime.Compiler服务的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),System.Runtime.CompilerServices.TaskAwaiter的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)1.GetResult() at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult( …

c# asp.net-web-api attributerouting asp.net-web-api-routing

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

剃刀查看引擎自动应用报价?

我现在已经习惯了剃刀,但我不明白为什么以下语法是正确的?

<li @(active ? "class=active" : "")>
   @Html.ActionLink(item.Text, item.TargetAction, Model.Controller)
</li>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,我有条件地应用了一个类(我用这种方式编写它,因此如果bool active == false则不生成类标记).

我无法理解的是,为什么这会产生正确的报价给出:

<li class="active"><a href="/">Home</a></li>
   <a href="/">Home</a>
</li>
Run Code Online (Sandbox Code Playgroud)

不知何故,它是神奇地整理引用,但我在剃刀的文章中找不到任何参考,以表明这是预期的,所以我想知道它是否依赖于破碎的行为.如果我在单词'active'周围的字符串中添加单引号或双引号,就像你想要的那样,如果你想要html,我最终得到:

<li class="'active'">
    <a href="/">Home</a>
</li>
Run Code Online (Sandbox Code Playgroud)

要么

<li class=&quot;active&quot;>
    <a href="/">Home</a>
</li>
Run Code Online (Sandbox Code Playgroud)

为什么它以这种方式工作,并且我的代码是正确的(而不是简单的功能)?

asp.net razor

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

Observable.FromEvent和CreateDelegate param映射

我正在考虑实施

Observable.FromEvent<TEventHandler, TEventHandlerArgs>(add, remove)
Run Code Online (Sandbox Code Playgroud)

我正在努力把握它是如何运作的.让我们说TEventHandler是标准:

public delegate void EventHandler(object sender, EventArgs e);
Run Code Online (Sandbox Code Playgroud)

那令我困惑的代码是:

TEventHandler d = (TEventHandler) Delegate.CreateDelegate(
    typeof (TEventHandler),
    (object) new Action<EventArgs>(observer.OnNext),
    typeof (Action<EventArgs>).GetMethod("Invoke"));
Run Code Online (Sandbox Code Playgroud)

(我已将此通用代码专门用于此特定示例实例.)

CreateDelegate是如何创建一个签名委托(obj,args)绑定到动作上的签名(args)的调用方法?obj去哪儿了?

感觉有点像在行动中有一个开放的代表,我们正在强迫'this'成为CreateDelegate的'firstArguemnt'并允许args通过.如果这样感觉有点脏?

c# delegates system.reactive

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

VS2013和Newtonsoft.Json 3.5.0.2

安装了VS2013 RC以及之前的预览版后,MS似乎已经创建了一种情况,即在构建过程中,blend的集成导致旧版本的newtonsoft.json在搜索路径中最终结束.导致此类错误

"Newtonsoft.Json.Linq.JObject"类型在未引用的程序集中定义.您必须添加对程序集"Newtonsoft.Json,Version = 3.5.0.2,Culture = neutral,PublicKeyToken = null"的引用.

我一直在重命名:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dll
Run Code Online (Sandbox Code Playgroud)

哪个有效,就像这些reg键一样:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\Expression Blend MWD.Extensibility]
@="C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Blend\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\Expression Blend MWD.Interaction]
@="C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Blend\\"
Run Code Online (Sandbox Code Playgroud)

但是必须有更好的方法吗?当然不应该在我们自己的目标输出的VS二进制目录中找到不在gac中的依赖项?

visual-studio visual-studio-2013

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

Rx 2.1和Xamarin

我正在尝试在Xamarin上构建一个针对多个平台但使用rx的应用程序.到目前为止,我已经创建了一个核心PCL,我想使用rx,但是当我尝试导入rx 2.1 nuget包时,我收到以下错误:

您正在尝试将此软件包安装到以"portable-net40 + win + sl50 + wp80 + MonoAndroid10 + MonoTouch10"为目标的项目中,但该软件包不包含任何与该框架兼容的程序集引用或内容文件.有关更多信息,请与软件包作者联系.

我知道xamarin商店中有一个rx组件,但似乎我不能将它添加到我的PCL中.

在我看来,理想情况下我想要PCL中的核心rx库,但是应该在特定于平台的应用程序实现中导入特定于平台的调度程序.

目前最好的方法是什么?

nb我知道在其他问题中已经触及了这个问题,但答案是在Xamarin发布通道PCL支持之前.

编辑:

我已将我的PCL修改为目标.net 4.5(并删除了silverlight).我现在可以拉入rx nuget包但是我得到一个构建警告,它无法解析'system.runtime.interopservices.windowsruntime'.

xamarin.ios system.reactive xamarin.android portable-class-library xamarin

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

c#struct array的并发性

给定一个struct数组:

public struct Instrument
{
    public double NoS;
    public double Last;
}

var a1 = new Instrument[100];
Run Code Online (Sandbox Code Playgroud)

并且一个线程任务池正在写入这些元素,因为单个元素最多可以同时由两个线程写入,每个双字段一个(有效地通过主题进行上游排队).

并且知道双重可以在64位上原子地写入.(编辑这个错误地说原来是32位)

我需要使用数组中的所有值定期执行计算,并且我希望它们在计算期间保持一致.

所以我可以使用以下方法对数组进

var snapshot = a1.Clone();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是关于同步的具体细节.如果我使成员易变,我认为这根本不会帮助克隆,因为读/写aquire/releases不在数组级别.

现在我可以有一个数组锁,但这会在最常见的数据写入数组的过程中引起很多争论.所以不太理想.

或者我可以有一个每行锁定,但这将是一个真正的痛苦,因为他们都需要在克隆之前被获取,同时我有所有备份的写入.

现在,如果快照没有最新值(如果它只是微秒等)并不重要,所以我想我可能会因为没有锁而逃脱.我唯一担心的是,是否存在持续时间段内没有缓存写回的情况.这是我应该担心的吗?编写器在TPL数据流中,唯一的逻辑是在结构中设置两个字段.我真的不知道函数范围是如何或者是否与缓存回写相关联.

思考/建议吗?

编辑:如果我使用互锁写入结构中的变量怎么样?

edit2:写入量比读取量高很多.写入Nos&Last字段还有两个单独和并发的服务.所以他们可以同时写入.这导致参考对象方法存在原子性问题.

edit3:更多细节.假设数组是30-1000个元素,每个元素可以每秒多次更新.

c# concurrency struct volatile memory-barriers

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