小编Son*_*oul的帖子

线程安全事件调用

触发事件时避免竞争条件(在多线程应用程序中)的常见做法是:

EventHandler<EventArgs> temp = SomeEvent;
if (temp != null) temp(e);

"Remember that delegates are immutable and this is why this technique works in theory. However, what a lot of developers don't realize is that this code could be optimized by the compiler to remove the local temp variable entirely. If this happens, this version of the code is identical to the first version, so a NullReferenceException is still possible."
Run Code Online (Sandbox Code Playgroud)

问题(根据书中)是"编译器可以优化此代码以完全删除本地临时变量.如果发生这种情况,此版本的代码与第一个版本相同,因此仍然可以使用NullReferenceException"

根据CLR通过C#,这是强制编译器复制事件指针的更好方法.

virtual void OnNewMail(NewMailEventArgs e)
{
    EventHandler<NewMailEventArgs> temp =
                          Interlocked.CompareExchange(ref …
Run Code Online (Sandbox Code Playgroud)

c# multithreading .net-4.0

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

visual studio发布选择错误的web.config转换

根据我读到的内容,只要你有一个与发布配置文件的名称相匹配的转换,就应该应用它,但对我来说情况并非如此.

发布个人资料

PublisProfiles
    dev.pubxml
    local.pubxml
Run Code Online (Sandbox Code Playgroud)

变换

 Web.Config
     Web.Debug.config
     Web.local.config
     Web.Release.config
Run Code Online (Sandbox Code Playgroud)

当我使用本地配置发布时,我看到:

Transformed Web.config using  C:\...\Web.Release.config into obj\Release\TransformWebConfig\transformed\Web.config.
Run Code Online (Sandbox Code Playgroud)

所以它正在使用Release.config ..我打开了local.pubxml并尝试更改它

<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
Run Code Online (Sandbox Code Playgroud)

至:

<LastUsedBuildConfiguration>local</LastUsedBuildConfiguration>
Run Code Online (Sandbox Code Playgroud)

但后来它正在使用Web.Debug.config转换.

开发,发布,局部变换除了一些转换属性外是相同的.

.net transform msdeploy visual-studio-2012 visual-studio-2013

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

为WPF控件ToolTip添加条件可见性

我想使文本块工具提示有条件地可见.

我将工具提示定义为:

<TextBlock>
    <TextBlock.ToolTip>
        <Grid>...</Grid>
    </TextBlock.ToolTip>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

可见性属性在该定义中的位置?它似乎不喜欢我的任何猜测.

有一些建议只是使用网格可见性.这种方法的问题是使网格不可见仍然会显示空的工具提示框..这就是我试图控制工具提示可见性的原因.

wpf wpf-controls

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

c#中的Timespan交叉点

假设我有2个日期范围.

这些日期范围可以表示为时间跨度.

我想找到一个日期范围,在两个时间跨度内.

Range 1: 2/1/2011 - 8/1/2011 (timespan of 6 months)
Range 2: 5/2/2011 - 5/28/2011 (timespan of 26 days)
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,交叉点将是5/2/2011-5/28/2011,但是范围可以向任一方向移动(或者根本不相交)在这种情况下我希望得到的时间跨度为0长度)

最后,我需要生成交叉时间跨度的开始/结束的日历日期(不仅仅是刻度/小时/天等)

在c#3.0中有一种优雅的方法吗?

UPDATE

我使用了StriplingWarriors代码并创建了一个方法.

    private static DateRange GetIntersectionRange(DateRange range1, DateRange range2) {
        var iRange = new DateRange();
        iRange.From = range1.From < range2.From ? range2.From : range1.From;
        iRange.To = range1.To < range2.To ? range1.To : range2.To;
        if (iRange.From > iRange.To) iRange = null;
        return iRange;
    }
Run Code Online (Sandbox Code Playgroud)

.net c# timespan

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

绑定到ViewModel.SubClass.Property(子属性)

假设我的屏幕上有一个部分,其中编辑了"当前记录"..所以我的视图模型有一个包含所有当前编辑属性的类,例如:

class Record { 
    public string Notes { get { return "Foo"; } set { _notes = value; Notify("Notes"); }
}
Run Code Online (Sandbox Code Playgroud)

我们将此类添加到视图模型中:

class AdjustsmentViewModel {
    public Record CurrentRecord { get { return new Record(); }}
}
Run Code Online (Sandbox Code Playgroud)

如何在我的视图中绑定到CurrentRecord的Notes属性?我试过这个:

<TextBox Text="{Binding CurrentRecord.Notes, Mode=TwoWay}" VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" AcceptsReturn="True"  />
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我也试过设置周围StackPanel的DataContext:

<StackPanel DataContext="{Binding CurrentRecord}">
Run Code Online (Sandbox Code Playgroud)

之后,我尝试了我的TextBox {Binding Notes}和{Binding Path = Notes},但这些似乎都不起作用.

也许上面真的应该工作,我在其他地方搞乱一些事情?

更新

这发生在用户控件中.此用户控件具有单独的视图模型,从其父窗口开始.

this.DataContext = UnityUtil.Resolve<AdjustmentsViewModel>();
Run Code Online (Sandbox Code Playgroud)

此外,我看到一个绑定错误:"对象"''MainViewModel'上找不到'Notes'属性

该视图模型在主窗口中设置.

为了验证我有正确的ViewModel绑定,我只是直接在viewmodel上添加了这个属性:

public string Notes2 { get { return "Bar"; } } 
Run Code Online (Sandbox Code Playgroud)

和视图中的相应文本块:

<TextBlock Text="{Binding Path=Notes2}" /> …
Run Code Online (Sandbox Code Playgroud)

wpf binding mvvm

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

MVC 4 AuthorizeAttribute.HandleUnauthorizedRequest ViewResult - 无限循环

我已经完成了我的代码一百万次,并且无法找到我的实现问题.

在自定义AuthorizeAttribute中我覆盖了2个方法

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.Request.IsAuthenticated)
            return false;
        var routeData = httpContext.Request.RequestContext.RouteData;
        var ctrl = routeData.Values["controller"].ToString();
        var action = routeData.Values["action"].ToString();
        var user = httpContext.User.Identity.Name;
        _logger.Info("[logging all the details]");
        return ctrl == "SomeController";
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext ctx)
    {
        ctx.Result = new ViewResult  { ViewName = "Unauthorized" };
        // base.HandleUnauthorizedRequest(ctx);
     }
Run Code Online (Sandbox Code Playgroud)

授权逻辑被模拟为仅在特定控制器上返回false,并且我已逐步完成此操作以验证它是否正常工作.

上面的代码会导致无限循环.在我的日志中我可以看到该行达到了666次(巧合?)

如果我打电话给base.HandleUnauthorizedRequest(ctx),我得到的只是一个空白页面.所以我反映了基地的作用,就是这样

filterContext.Result = new HttpUnauthorizedResult();
Run Code Online (Sandbox Code Playgroud)

所以这解释了为什么它呈现一个空白页而不是重定向到Unauthorized.cshtml.我不确定的是,如果我不打电话给基地,为什么它会进入无限循环.

PS

我已经验证,如果我放错了未经授权的视图,它将会出错(但仍会无限期挂起)

 System.InvalidOperationException: The view 'Unauthorized11' or its master was not found or no view engine supports …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc asp.net-authorization asp.net-mvc-4

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

如何在MVC或Web Api ajax调用中验证referrer

我的MVC应用程序有常见的ajax方法(在web api和常规控制器中).我想基于我的应用程序来自哪个区域(视图)来授权这些调用.我面临的问题是如何验证ajax调用的来源.

我意识到这不容易实现,因为ajax调用很容易被欺骗,但由于我可以完全控制视图的呈现方式(整页源代码),或许有一种方法可以嵌入防伪类型的标记,以后可以验证到网址推荐人.

身份验证已经处理完毕,我可以安全地验证呼叫的身份,唯一的问题是验证呼叫来自哪个URL(MVC路由).更具体地,防止用户欺骗ajax调用的起源.

我尝试创建一个自定义授权标头并在视图渲染和ajax调用之间传递它,这很有效,但仍然很容易欺骗(因为用户可以从网站的另一部分嗅探标头并重新使用它们).最后,我不确定如何安全地验证标头是否已被欺骗.我想到的唯一事情就是编写一些关于令牌内部原始上下文的信息,并以某种方式对传入的调用上下文(在ajax调用中传递令牌的那个)进行验证.

我看到MVC具有AntiForgery令牌功能,但我不确定这是否可以解决我的问题.如果是这样,我想知道它是如何用来验证/api/common/update/home/indexvs /user/setup调用的(这两个调用都是有效的).

同样,我想要一种方法来验证ajax调用来自哪个页面,并且用户身份不是问题.

更新

根据@Sarathy的推荐,我尝试实施防伪令牌.据我所知,通过在每个页面上添加带有令牌的隐藏字段,并将其与cookie中设置的令牌进行比较,我可以告诉它.以下是执行令牌验证的自定义操作过滤器属性的实现:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var req = filterContext.RequestContext.HttpContext.Request;
        var fToken = req.Headers["X-Request-Verification-Token"];
        var cookie = req.Cookies[AntiForgeryConfig.CookieName];
        var cToken = cookie != null
            ? cookie.Value
            : "null";

        log.Info("filter \ntoken:{0} \ncookie:{1}", fToken, cToken);
        AntiForgery.Validate(cToken, fToken);
        base.OnActionExecuting(filterContext);
    }
Run Code Online (Sandbox Code Playgroud)

然后我的反伪造附加数据提供者看起来像这样:

public class MyAntiForgeryProvider : IAntiForgeryAdditionalDataProvider
{
    public string GetAdditionalData(System.Web.HttpContextBase context)
    {
        var ad  = string.Format("{0}-{1}",context.Request.Url, new Random().Next(9999));
        log.Info("antiforgery AntiForgeryProvider.GetAdditionalData Request.AdditionalData: {0}", ad);
        log.Info("antiforgery AntiForgeryProvider.GetAdditionalData Request.UrlReferrer: {0}", context.Request.UrlReferrer); …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc csrf asp.net-mvc-4 asp.net-web-api

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

System.Windows.Interactivity:无法加载文件或程序集'System.Windows,Version = 2.0.5.0

我试图引用System.Windows.Interactivity以支持IsExpanded行为命令

但是,只要我添加对此程序集的引用,我就会收到加载System.Windows 2.0的错误.这似乎是一个已知的错误,解决方案似乎只是引用该程序集.

我下载了Silverlight SDK,并在我的项目中引用了相关的程序集.

但是,现在我在System.Windows和WindowsBase.dll之间遇到了很多冲突.像RoutedEventHandler这样的类都存在于两者中.必须是解决这个问题的一种方法,因为我看到人们成功地将这个Interactivity dll与wpf 4.0一起使用.

.net c# silverlight wpf

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

子类化WPF窗口

我创建了一个WPF窗口

我将其类定义修改为:

public partial class myWindow : mySubclassedWindow
Run Code Online (Sandbox Code Playgroud)

编译器抛出:

"'myWindow'的部分声明不能指定不同的基类"

myWindow.Xaml:

x:Class="WpfGridtest.myWindow"
Run Code Online (Sandbox Code Playgroud)

所以在某个地方,还有另一个部分类,它继承自"Window",但我找不到它.如何覆盖我的情况以使用子类窗口?


谢谢乔恩,这就是问题所在.还找到了这篇有用的文章:http: //geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

wpf subclassing

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

在C#中找到字符串的最快方法?

在C#中实现类似内容的最快方法是什么:

  private List<string> _myMatches = new List<string>(){"one","two","three"};
  private bool Exists(string foo) {
      return _myMatches.Contains(foo);
  }
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个例子.我只需要对源自字符串的某些值执行低级别过滤.我可以实习他们,但仍然需要支持一个或多个字符串的比较.含义,字符串到字符串比较(1个过滤器),或者字符串是否存在于字符串列表中(多个过滤器).

c# string performance

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