看起来根据 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)
这是应该发生的事情:
但在第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) 在浏览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) 在检查C#和.NET中的代表时,我注意到一些有趣的事实:
在C#中创建委托会创建一个MulticastDelegate使用构造函数派生的类:
Run Code Online (Sandbox Code Playgroud).method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed { }
这意味着它需要实例和指向该方法的指针.然而,在C#中构造委托的语法表明它有一个构造函数
Run Code Online (Sandbox Code Playgroud)new MyDelegate(int () target)
我可以将其识别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);
这与反汇编的构造函数签名一致,但这不能编译!
最后一个有趣的注意事项是类Delegate和MulticastDelegate另外一组构造函数:
.method family hidebysig specialname rtspecialname instance void .ctor(类System.Type target,string'method')cil managed
从实例和方法指针到类型和字符串方法名称的转换发生在哪里?这可以通过runtime managed自定义委托构造函数签名中的关键字来解释,即运行时是否在此处执行此操作?
编辑 …
我发现如果我运行以下代码行.
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程序集以查看一些内部结构时,我注意到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)