小编Gre*_*ech的帖子

属性的顺序是否有任何保证?

如果将多个属性应用于成员,例如

[Foo]
[Bar]
void Baz() { ... }
Run Code Online (Sandbox Code Playgroud)

那么CLR/.NET规范是否保证在通过反射检索它们时将检索它们的顺序(例如Attribute.GetCustomAttributes)?这些方法的文档并没有明确说明,虽然它们似乎是按照它们应用的顺序返回的,但我不想依赖于未记录的行为,因为它只是在寻找麻烦.

至于为什么这可能很重要,想象一下这些属性用于表示该方法应该有一系列拦截器,这些拦截器应该以特定的顺序运行.

.net attributes

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

构建包含其所有依赖项的JAR

这可能是一个非常基本的问题,但我担心我对Java知之甚少,而且无法在任何地方找到答案.

我正在尝试构建一个依赖于TFS SDK的Ant库.我按照指南来设置项目,但当我将其导出为JAR并尝试使用ANT运行任务时,我收到以下错误:

java.lang.NoClassDefFoundError: /com/microsoft/tfs/core/util/TFSUser
Run Code Online (Sandbox Code Playgroud)

我意识到我可以将TFS SDK JAR放在我的ANT lib文件夹中,但是如果可能的话,我希望我的JAR能够包含它并且库只需要工作而不必这样做.

这个答案似乎说可以包含使用Eclipse运行所需的所有资源(我正在使用3.7.2),但它没有详细说明如何实际执行它.Eclipse中有哪些选项可以做到这一点?

java ant jar

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

MVC 2 AntiForgeryToken - 为什么对称加密+ IPrinciple?

我们最近更新了我们的MVC 2解决方案,这已经更新了它的AntiForgeryToken工作方式.不幸的是,这不再符合我们的AJAX框架.

问题是MVC 2现在使用对称加密来编码关于用户的一些属性,包括用户的Name属性(来自IPrincipal).我们能够使用AJAX安全地注册新用户,之后后续的AJAX调用将无效,因为当用户被授予新的主体时,防伪令牌将会改变.还有其他可能发生这种情况的情况,例如用户更新姓名等.

我的主要问题是为什么MVC 2甚至会使用对称加密?那为什么它关心主体上的用户名属性呢?

如果我的理解是正确的,那么任何随机共享秘密都可以.基本原则是将向用户发送带有一些特定数据的cookie(HttpOnly!).然后,需要此cookie来匹配发回的表单变量以及可能具有副作用的每个请求(通常是POST).由于这只是为了防止跨站点攻击,因此很容易制定一个易于通过测试的响应,但前提是您可以完全访问cookie.由于跨站点攻击者无法访问您的用户cookie,因此您受到保护.

通过使用对称加密,检查cookie内容有什么好处?也就是说,如果我已经发送了一个HttpOnly cookie,攻击者就无法覆盖它(除非浏览器存在重大安全问题),那么为什么我需要再次检查呢?

在考虑之后它似乎是那些"增加的安全层"案例之一 - 但是如果你的第一道防线已经下降(HttpOnly)那么攻击者无论如何都会通过第二层,因为他们有完全访问权限对用户cookie集合,可以直接模仿它们,而不是使用间接的XSS/CSRF攻击.

当然我可能会错过一个重大问题,但我还没有找到它.如果这里有一些明显或微妙的问题,那么我想了解它们.

asp.net asp.net-mvc csrf antiforgerytoken asp.net-mvc-2

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

是否可以在堆栈上间接加载值类型

在Microsoft IL中,要在值类型上调用方法,您需要间接引用.假设我们有一个名为"il"的ILGenerator,目前我们在堆栈顶部有一个Nullable,如果我们要检查它是否有值,那么我们可以发出以下内容:

var local = il.DeclareLocal(typeof(Nullable<int>));
il.Emit(OpCodes.Stloc, local);
il.Emit(OpCodes.Ldloca, local);
var method = typeof(Nullable<int>).GetMethod("get_HasValue");
il.EmitCall(OpCodes.Call, method, null);
Run Code Online (Sandbox Code Playgroud)

但是,跳过将其保存为局部变量并简单地在堆栈上已有的变量的地址上调用方法会很好,例如:

il.Emit(/* not sure */);
var method = typeof(Nullable<int>).GetMethod("get_HasValue");
il.EmitCall(OpCodes.Call, method, null);
Run Code Online (Sandbox Code Playgroud)

ldind系列指令看起来很有前途(特别是ldind_ref),但我找不到足够的文档来知道这是否会导致值的装箱,我怀疑它可能.

我已经看过C#编译器输出,但它使用局部变量来实现这一点,这让我相信第一种方式可能是唯一的方法.有没有更好的想法?

****编辑:附加说明****

尝试直接调用该方法,如下面的程序中注释掉的行不起作用(错误将是"操作可能使运行时不稳定").取消注释行,您将看到它按预期工作,返回"True".

var m = new DynamicMethod("M", typeof(bool), Type.EmptyTypes);
var il = m.GetILGenerator();
var ctor = typeof(Nullable<int>).GetConstructor(new[] { typeof(int) });
il.Emit(OpCodes.Ldc_I4_6);
il.Emit(OpCodes.Newobj, ctor);
//var local = il.DeclareLocal(typeof(Nullable<int>));
//il.Emit(OpCodes.Stloc, local);
//il.Emit(OpCodes.Ldloca, local);
var getValue = typeof(Nullable<int>).GetMethod("get_HasValue");
il.Emit(OpCodes.Call, getValue);
il.Emit(OpCodes.Ret);
Console.WriteLine(m.Invoke(null, null));
Run Code Online (Sandbox Code Playgroud)

所以你不能简单地用堆栈上的值调用方法,因为它是一个值类型(尽管你可以使用它是一个引用类型).

我想要实现(或知道是否可能)是替换显示注释的三行,但保持程序正常工作,而不使用临时本地.

cil reflection.emit

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

REST URI和对象的操作,可以对其进行评论,标记,评级等

我正在为我的公司研究一个Web API,它开始看起来像我们可能实现一个RESTful的.我现在已经阅读了几本关于此的书(O'Reilly的"RESTful Web服务"似乎最有用),并为可以评论,标记和评级的对象提出了以下一组URI和操作. .

对象是什么并不重要,因为这种情况适用于网络上的许多事情,但为了争论,我们可以说这是一部电影.

其中一些似乎非常自然,但其他人似乎有点强迫(特别是评级和标记)所以有人对如何改进这些有任何建议吗?我将列出它们与URI,然后支持动词,以及我建议他们会做什么.

/movies
Run Code Online (Sandbox Code Playgroud)

GET =列出电影

/movies/5
Run Code Online (Sandbox Code Playgroud)

GET =获取电影5

/movies/5/comments
Run Code Online (Sandbox Code Playgroud)

GET =列出对电影5的评论

POST =在电影5上创建新评论

/movies/5/comments/8
Run Code Online (Sandbox Code Playgroud)

GET =在电影5上获得评论8

POST =回复关于电影5的评论8

PUT =更新电影5的评论8

/movies/5/comments/8/flag
Run Code Online (Sandbox Code Playgroud)

GET =检查电影是否标记为不合适(如果不是,则为404)

PUT =将电影标记为不合适

/movies/5/rating
Run Code Online (Sandbox Code Playgroud)

GET =获取电影的评级

POST =将电影的用户评分添加到总评分中

编辑:我的意图是电影对象将其评级作为属性,所以我真的不希望在这里使用GET方法.URI确实存在,因此评级可以是可以使用POST动词更新的单个资源.我不确定这是否是最佳方式,但我想不出更好的方法

/movies/5/tags/tagname
Run Code Online (Sandbox Code Playgroud)

GET =检查电影是否标记有标记名(如果不标记,则为404;但如果标记有标记名称,则应通过重定向到类似/tags/tagname?来返回实际标记资源)

PUT = 为电影添加标记标记名,/tags/tagname如果需要,创建标记资源

DELETE = 从影片中删除标记标记名,tags/tagname如果删除后没有标记任何内容,则删除标记资源


请注意,这些不是整个URI,例如列出电影的URI将支持过滤,分页和排序.为此,我计划的事情如下:

/movies/action;90s/rating,desc/20-40
Run Code Online (Sandbox Code Playgroud)

哪里:

action; 90s是一个以分号分隔的过滤条件集

等级,desc是排序顺序和方向

20-40是要获得的项目索引的范围

关于这个API方案的任何评论呢?


编辑#1

这篇文章现在变得很长!在阅读了一些答案和评论之后,这是我计划制作的以上内容的变化:

标签将作为一个组而不是单独处理,因此它们将位于:

/movies/5/tags
Run Code Online (Sandbox Code Playgroud)

GET = List标签

POST =指定标签和现有标签的联合

PUT =用指定的标签替换任何当前标签

DELETE =删除所有标签

我仍然不确定如何处理标记评论.一个选项是,注释对象将包含其父级,而不是POST到回复它的注释,因此它可以被POST到一般URI,即

/movie/5/comment
Run Code Online (Sandbox Code Playgroud)

POST …

rest web-services

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

TimeZoneInfo和国家/地区代码

我正在寻找一个具有如下签名的函数:

bool IsTimeZoneValid(string countryCode, DateTime localTime);
Run Code Online (Sandbox Code Playgroud)

目的是确定该国家是否具有当地时间有效的时区,因为我们知道当前的UTC时间.让我们说,为了论证,"有效"意味着当转换为UTC时,时间距离我们认为的时间是+/- 30分钟.

例如,假设它当前是03/08/2009 18:25:00 UTC,然后给出澳大利亚的以下方法调用,它应该返回,true因为这是"东部标准时间"区域中的有效时间:

IsTimeZoneValid("AU", DateTime.Parse("04/08/2009 03:25:00"));
Run Code Online (Sandbox Code Playgroud)

然而,以下对法国的呼吁应该失败,因为这不是法国时区的有效时间.

IsTimeZoneValid("FR", DateTime.Parse("04/08/2009 03:25:00"));
Run Code Online (Sandbox Code Playgroud)

这需要准确,并考虑夏令时等.

TimeZoneInfo如果我知道特定国家/地区存在哪些时区,.NET 3.5包含可以为我做很多转换的新类,但我似乎无法找到任何内置查找.我错过了什么,或者我将不得不手动创建一个国家/地区到时区映射表?

重申一下,我的问题是:鉴于国家代码,我如何获得时区列表.或者,还有另一种方法可以解决这个问题吗?

.net c# timezone country-codes

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

最近的C#相当于F#匹配表达式?

我的情况是我的很多类都是众所周知但不同类型的无序对象的容器,例如容器可能如下所示:

public class Container
{
    public A A { get; private set; }
    public B B { get; private set; }
    public C C { get; private set; }

    public bool StoreIfKnown(object o)
    {
        // TODO...
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果o是类型A应当存储在A属性类型BB物业等.

在F#中,StoreIfKnown方法可以写成如下所示(原因是语法错误,我的F#不是很好而且非常生疏):

match o with
| ?: A a -> A <- a; true
| ?: B b -> B <- b; true
| ?: C c -> C <- …
Run Code Online (Sandbox Code Playgroud)

c# f# casting guard-clause

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

重复的Referrer标头 - HTTP.sys barfs

我一直在网页上测试带有嵌入式Flash组件的PS3浏览器(NetFront),并且发出任何来自Flash的请求的方式似乎都存在相当严重的错误.浏览器正在添加引用者(referer),因此Flash播放器也会导致重复的标题.如果引用者标题相同,这实际上是正常的,但它们不是,因此请求由W2k8上的http.sys停止.这对我来说是一个主要问题,因为我有一个需要调用Web服务才能运行的Flash组件.

我们是否有某种方式可以过滤或允许这些请求,可能会沿途重复删除标题.

我们已经考虑过但我们的开发和实时环境不是最理想或不可能的一些解决方案是:

  • 在服务器前添加代理以清理请求.
  • 在我们的负载均衡器上修复请求.这可能适用于我们的实时环境,但不适用于开发环境.使用负载均衡器来执行此操作也是不好的做法,我们的运营团队不会高兴:)
  • 在初始化期间通过flashvars将所有数据发送到Flash.可能通过Javascript进行任何更新/回调.这感觉很乱,并且需要一个平台的重要自定义代码.
  • 阻止浏览器或Flash发送引荐来源标头.这是可以接受的,但似乎没有办法在Flash或NetFront中启用此功能.

作为参考,以下请求将重现问题(复制并粘贴到Fiddler或其他工具中,我假设您正在运行IIS7,W2K8,因为我们是).你应该得到400 Bad Request回应.

GET / HTTP/1.1
Host: localhost
Referer: http://localhost/NetFrontBrowser/
Referer: http://localhost/Flash/

非常感谢

flash http-referer header http ps3

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

轻量级代码生成(LCG)是否已经死亡?

在.NET 2.0-3.5框架中,LCG(又名DynamicMethod类)是在运行时发出轻量级方法的一种不错的方法,当时不需要类结构来支持它们.

在.NET 4.0中,表达式树现在支持语句和块,因此似乎提供了足够的功能来构建这种方法可能需要的任何功能,并且可以比直接发送CIL更容易和更安全地构建操作码.(这个陈述来自于今天将一些最复杂的LCG代码转换为使用表达式树构建和编译的实验.)

那么有什么理由可以在任何新代码中使用LCG吗?那表达树不能做什么吗?或者它现在是一个"死"的功能?

code-generation .net-4.0 lcg

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

响应幂等HTTP POST请求

我们的RESTful API的一部分将允许用户注册带有序列号的项目.由于序列号不是全局唯一的,因此不能用作资源的标识符,因此我们将对父资源使用POST来生成标识符,例如

POST /my/items

<item serial-number="ABCDEF" />
Run Code Online (Sandbox Code Playgroud)

在项目尚未注册的情况下,HTTP语义被很好地定义.我们返回一个Location标头,并将注册的项目作为实体主体,例如

HTTP 201 Created
Location: /my/items/1234    

<item id="1234" serial-number="ABCDEF" />
Run Code Online (Sandbox Code Playgroud)

但是,在项目已经注册的情况下,API应该是幂等的并返回先前注册的项目而不创建新项目.我最好的猜测是,它应该返回200 OK状态代码,并使用Content-Location标头指示项目实际来自哪里,例如

HTTP 200 OK
Content-Location: /my/items/1234    

<item id="1234" serial-number="ABCDEF" />
Run Code Online (Sandbox Code Playgroud)

这看起来合情合理吗?我不完全清楚位置或内容位置是否更适合第二种情况.

rest http http-post

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