标签: .net-internals

Chrome会在HTTP 302重定向时取消CORS XHR

看起来根据 CORS规范,GET和POST请求应该透明地遵循302重定向.但Chrome正在取消我的请求.

这是执行请求的JS:

var r = new XMLHttpRequest();
r.open('GET', 'https://dev.mysite.com/rest', true);
r.send();
Run Code Online (Sandbox Code Playgroud)

这是应该发生的事情:

  1. 客户:XHR POST请求/休息
  2. 服务器:使用HTTP 302重定向到/ rest /进行响应
  3. 客户:遵循该重定向

但在第2步之后,Chrome会取消该请求.如果没有HTTP 302,请求将完美地运行.我已经证实了这一点.

当请求运行时,我可以在Chrome的"网络"面板中看到只有一个XHR - 取消的POST请求,没有响应标头或响应正文.

使用Chrome的net-internals工具进行调试,我看到服务器发送了响应,之后,请求被取消了.以下是请求的输出:

79295: URL_REQUEST
https://dev.mysite.com/rest
Start Time: 2013-08-30 12:41:11.637

t=1377880871637 [st=    0] +REQUEST_ALIVE  [dt=13455]
t=1377880871638 [st=    1]    URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=1]
                              --> delegate = "extension Adblock Plus"
t=1377880871639 [st=    2]   +URL_REQUEST_START_JOB  [dt=13453]
                              --> load_flags = 143540480 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                              --> method = "POST"
                              --> priority = 2 …
Run Code Online (Sandbox Code Playgroud)

redirect google-chrome xmlhttprequest .net-internals cors

44
推荐指数
3
解决办法
6万
查看次数

固定对象时的GC行为

在浏览PinnableObjectCachefrom 的代码时mscorlib,我遇到了以下代码:

for (int i = 0; i < m_restockSize; i++)
{
    // Make a new buffer.
    object newBuffer = m_factory();

    // Create space between the objects.  We do this because otherwise it forms 
    // a single plug (group of objects) and the GC pins the entire plug making 
    // them NOT move to Gen1 and Gen2. By putting space between them
    // we ensure that object get a chance to move independently (even if some …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection .net-internals .net-4.6

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

.NET代表:他们是如何构建的?

在检查C#和.NET中的代表时,我注意到一些有趣的事实:

在C#中创建委托会创建一个MulticastDelegate使用构造函数派生的类:

.method public hidebysig specialname rtspecialname instance 
   void .ctor(object 'object', native int 'method') runtime managed { }
Run Code Online (Sandbox Code Playgroud)

这意味着它需要实例和指向该方法的指针.然而,在C#中构造委托的语法表明它有一个构造函数

new MyDelegate(int () target)
Run Code Online (Sandbox Code Playgroud)

我可以将其识别int ()为函数实例(int *target() 将是C++中的函数指针).很明显,C#编译器从函数名定义的方法组中选出正确的方法并构造委托.所以第一个问题是,C#编译器(或者Visual Studio,准确地说)从哪里选择这个构造函数签名?我没有注意到任何可以区分的特殊属性或东西.这是某种编译器/ visualstudio魔术吗?如果没有,那么T (args) target结构在C#中是否有效?我没有设法用它来编译,例如:

int()target = MyMethod;

是无效的,所以做任何事情MyMetod,例如调用.ToString()它(这确实有一定意义,因为这在技术上是一个方法,但我想应该可以通过强制显式选择一个方法,例如(int())MyFunction.所以所有这个纯粹的编译魔术?通过反射器看结构揭示了另一种语法:

Func CS $ 1 $ 0000 = new Func(null,(IntPtr)Foo);

这与反汇编的构造函数签名一致,但这不能编译!

最后一个有趣的注意事项是类DelegateMulticastDelegate另外一组构造函数:

.method family hidebysig specialname rtspecialname instance void .ctor(类System.Type target,string'method')cil managed

从实例和方法指针到类型和字符串方法名称的转换发生在哪里?这可以通过runtime managed自定义委托构造函数签名中的关键字来解释,即运行时是否在此处执行此操作?

编辑 …

.net c# clr delegates .net-internals

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

为什么在原始类型实例上调用Object类的某些函数需要装箱?

我发现如果我运行以下代码行.

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object
Run Code Online (Sandbox Code Playgroud)

没有拳击已经完成,但如果我调用i.GetType()(另一个派生函数System.Object)代替GetHashCode(),拳击将需要调用GetType(),为什么它不可能直接调用GetType()原始类型实例,没有拳击,而它可以调用GetHashCode()没有拳击?

.net c# .net-internals

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

了解.NET内部的StringBuilderCache类配置

当我查看反编译的.NET程序集以查看一些内部结构时,我注意到StringBuilderCache了多个框架方法使用的有趣类:

internal static class StringBuilderCache
{
    [ThreadStatic]
    private static StringBuilder CachedInstance;
    private const int MAX_BUILDER_SIZE = 360;
    public static StringBuilder Acquire(int capacity = 16)
    {
        if (capacity <= 360)
        {
            StringBuilder cachedInstance = StringBuilderCache.CachedInstance;
            if (cachedInstance != null && capacity <= cachedInstance.Capacity)
            {
                StringBuilderCache.CachedInstance = null;
                cachedInstance.Clear();
                return cachedInstance;
            }
        }
        return new StringBuilder(capacity);
    }
    public static void Release(StringBuilder sb)
    {
        if (sb.Capacity <= 360)
        {
            StringBuilderCache.CachedInstance = sb;
        }
    }
    public static string GetStringAndRelease(StringBuilder sb)
    {
        string …
Run Code Online (Sandbox Code Playgroud)

.net c# stringbuilder .net-internals

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